1.本手册是我私人整理的,我工作中最常使用的 Linux 命令,现公开给大家查看
2.如需有补充的话,欢迎再评论区贴上你的代码,或者提示一下使用的思路,我后续可更新到正文里面去
3.期待大佬们的指导,来都来了,欢迎留下你的足迹
# grep 搜索命令
全称为:Global search Regular Expression and Print out the line
含义大致可译为: 能够使用正则表达式进行全局搜索的命令
附述:
-C 5 符合匹配的前后5行,不包含当前行
-A 5 符合匹配的后5行,不包含当前行
-B 5 符合匹配的前5行,不包含当前行
-c 返回匹配的行数,而不具体显示匹配的行
-h 不显示文件名
-i 在字符串比较的时候忽略大小写
-l 只显示包含匹配模板的行的文件名清单
-L 只显示不包含匹配模板的行的文件名清单
-n 在每一行前面打印改行在文件中的行数
-v 反向检索,只显示不匹配的行,小写的
-w 只显示完整单词的匹配
-x 只显示完整行的匹配
-r/-R 如果文件参数是目录,该选项将递归搜索该目录下的所有子目录和文件
-E 可以使用正则表达式进行匹配内容
# 如搜索日志文件,包含OK或者Ok,至少出现1次,然后返回所有符合匹配的行数:cat /var/log/mail.log | grep -E "O[K,k]{1,}" -c
grep -5 'parttern' inputfile //打印匹配行的前后5行
grep -C 5 'parttern' inputfile //打印匹配行的前后5行
grep -A 5 'parttern' inputfile //打印匹配行的后5行
grep -B 5 'parttern' inputfile //打印匹配行的前5行
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# tail 查看文件内容
# 显示最后25行内容
tail -25 test.log
# 特殊情况+10,表示显示从第10行开始到最后的内容
tail +10 test.log
# 实时跟踪文件最新内容,默认是最后10行
tail -f test.log
# 也可以指定最新行内容如指定最新5行内容:
tail -n 5 -f test.log
2
3
4
5
6
7
8
9
10
11
# nohup 挂起在后台运行
nohup就是不挂起的意思( no hang up)。
1.详解请看这里: Linux 输入输出重定向 2>/dev/null和>/dev/null 2>&1和2>&1>/dev/nul (opens new window)
类型 | 文件描述符 | 默认情况 |
---|---|---|
标准输入(standard input) | 用 0 表示 | 从键盘获得输入 |
标准输出(standard output) | 用 1 表示 | 输出到屏幕(即控制台) |
错误输出(error output) | 用 2 表示 | 输出到屏幕(即控制台) |
/dev/null 代表 linux 的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞”
1:> 代表重定向到哪里,例如:echo "123" > /home/123.txt
2:/dev/null 代表空设备文件
3:2> 表示stderr标准错误
4:& 表示等同于的意思,2>&1,表示 2 的输出重定向等同于 1
5:1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于 "1>/dev/null"
nohup 需要执行的指令/脚本 [ Arg … ] [ & ]
2
3
4
5
6
7
8
9
10
2.总而言之,在工作中用到最多的就是:nohup command >/dev/null 2>&1 &
命令,希望大家能够好好掌握。
使用nohup命令可以在后台挂起,退出还继续运行
3.下面介绍:2>&1 和 nohup的说明/使用
# 在crontab定时器任务中定义
* * * * * cd /home/hxana/analytics && python logdataCollection.py >>/logs/log_cronjob.txt 2>&1 &
2
contab每秒执行脚本,然后将把标准错误重定向到标准输出(2>&1)以追加的方式写入log_cronjob.txt。
补充:试想2>1代表什么,2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出;最后的&表示后台挂起且运行。
另外,使用nohup实现不挂断地运行命令。
# 该命令可以在你退出帐户/关闭终端之后继续运行相应的进程
nohup python logdataCollection.py >>/logs/log_cronjob.txt 2>&1
2
# crontab 定时命令详解
# 基本格式如下:
* * * * * command
[分钟] [小时] [天] [月] [周几] [需要执行的脚本]
# 注意:是5个字段的,后面的command表示需要指定的命令或者脚本,一个字段不能缺
[root@localhost ~]# crontab [选项]
选项:
-e: 编辑crontab定时任务
-l: 查询crontab任务
-r: 删除当前用户所有的crontab任务
(这个针对centos)如果需要将crontab定时服务开机启动的话,需要这样设置:
vim /etc/rc.d/rc.local
systemctl start crond.service # 加入当前命令即可
2
3
4
5
6
7
8
9
10
11
12
13
14
15
字段 | 含义 | 取值范围 |
---|---|---|
第一个 * | 一小时里面的第几分钟 | 0-59 |
第二个 * | 一天当中的第几个小时 | 0-23 |
第三个 * | 一个月当中的第几天 | 0-31 |
第四个 * | 一年当中的第几个月 | 0-12 |
第五个 * | 一周当中的星期几 | 0-7(0和7都是表示星期天) |
1.其中还有特殊的标点符号使用,如下:
特殊符号 | 含义 |
---|---|
* | 代表任何时间执行。如:是在分钟字段,那么久表示所有分钟,即每分钟都执行 |
, | 表示不连续时间段,只在列出来的时间上执行。如:5 9,12,15 * * * 这个命令表示在每天的9、12、15点的05分执行命令 |
- | 表示在连续的时间段执行。如:0 * * * 1-5 表示只在周一到周五的每小时0分执行 |
*/n | 表示多久执行一次。如:*/10 * * * * 表示每10分钟执行一次 |
例子
0 */1 * * * bash /home/node05/python/project/nc_environment/nc_environment/nc.sh
2
# lsof 按用户/端口等来搜索
1.lsof(list open files)是一个列出当前系统打开文件的工具。
2.lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root权限执行。
命令格式:
lsof [选项]
2
3.lsof关键选项 参考CSDN链接 (opens new window)
理解一些关于lsof如何工作的关键性东西是很重要的。
4.最重要的是,当你给它传递选项时,默认行为是对结果进行“或”运算。
因此,当你是使用两个参数同时进行搜索的时候,lsof是默认使用"或"来进行搜索的。如:你正是用-i来拉出一个端口列表,同时又用-p来拉出一个进程列表,那么默认情况下你会获得两者的结果。
5.下面的一些其它东西需要牢记:
默认 : 没有选项,lsof列出活跃进程的所有打开文件 组合 : 可以将选项组合到一起,如-abc,但要当心哪些选项需要参数
6.lsof -a,坑点:
-a表示多个搜索条件,结果按“与”进行展示
lsof -i:8080 -au jenkins 显示符合端口是8080,并且用户是jenkins的进程
没有-a,表示多个搜索条件,结果按“或”进行显示
lsof -i:8080 -u jenkins 显示符合端口是8080,并且用户是jenkins的进程
2
3
4
5
选项如下:
-a : 结果进行“与”运算(而不是“或”)
-l : 在输出显示用户ID而不是用户名
-h : 获得帮助
-t : 仅获取进程ID
-U : 获取UNIX套接口地址
-F : 格式化输出结果,用于其它命令。可以通过多种方式格式化,如-F pcfn(用于进程id、命令名、文件描述符、文件名,并以空终止)
-r : 永远在执行,表示多久再次刷新执行当前的命令,默认是15s刷新一次,后面可以接指定刷新参数
-i使用@host:port显示基于主机与端口的连接
lsof -i@192.168.1.51:22 # 查看指定ip指定端口的进程
lsof指令的常用用法:
lsof abc.txt 显示开启文件abc.txt的进程
lsof -i:22 知道22端口现在运行什么程序
lsof -c abc 显示abc进程现在打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /usr/local/ 显示目录下被进程开启的文件
lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长
lsof -d 4 显示使用fd为4的进程
lsof -i 用以按端口查询
lsof -i:7000 -r 3 表示3秒刷新、查询一次7000端口的进程
lsof -s 列出打开文件的大小,如果没有大小,则留下空白
lsof -u username 以UID,列出打开的文件(或是说属于这个用户之下的)
lsof -p 12 看进程号为12的进程打开了哪些文件
lsof +|-r [t] 控制lsof不断重复执行,缺省是15s刷新
-r,lsof会永远不断的执行,直到收到中断信号
+r,lsof会一直执行,直到没有档案被显示
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
lsof -n 将结果以IP的形式显示(不将IP转换为hostname),默认是以hostname显示的,区别于搜索结果的name字段
root@xx# lsof -i:7000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 8999 jenkins 140u IPv6 20086003 0t0 TCP bdserver.bdlifescience.com:afs3-fileserver (LISTEN)
root@xx# lsof -i:7000 -n
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 8999 jenkins 140u IPv6 20086003 0t0 TCP 192.168.1.251:afs3-fileserver (LISTEN)
2
3
4
5
6
7
8
# chown 修改文件所属用户及所属分组
一、
chown -R jenkins:jenkis userManage
第一个jenkins表示所属组
第二个jenkins表示所属用户
二、
chown jenkins userManage
表示这里只是修改这个文件/目录所属的用户
2
3
4
5
6
7
8
9
10
# scp 两台服务器传输文件
1.首先两台服务器必须是可以ping通的
例:
ping 10.22.137.10
ping通之后,可以复制文件/复制目录:
1、复制文件
格式:
scp 目录/文件名.文件格式 目标服务器用户名@ip地址:目标服务器目录
eg:
scp /backup/test/md3/export.sh root@10.22.137.11:/ssx/dev/md
2、复制目录(包括目录下的文件)
eg:
scp -r /backup/test/md3 root@10.22.137.11:/ssx/dev/md
2
3
4
5
6
7
8
9
10
11
12
13
# vi/vim 命令
# 可批量替换文本内容
替换详解好文请点击我进行了解 (opens new window)
前言:
s代表switch,替换
c代表confirm,确认
# 替换第3,4行的第一个report为admin
:3,4s/report/admin
# 替换第3,4行的所有report为admin
3,4s/report/admin/g
# 提换第1行到最后一行,所有的old替换为new($s可以理解为表示最后一行)
:1,$s/old/new/g 等价于 :$s/old/new/g
# 替换前需要确认,可以这样写:
在替换命令尾部加上c (confirm用于确认),在替换每个old前都会提示并确认:
:1,30s/old/new/gc # 替换1至30行的所有old为new,并且逐一进行确认替换
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 查看Linux版本所有信息:lsb_release -a
或者:cat /etc/issue
jenkins@develop:/var/bdls/dev/report_hualiao/bin$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.2 LTS
Release: 18.04
Codename: bionic
2
3
4
5
6
# ln 软连接命令
使用方法为:ln -s 源文件 目标文件
desc:然后你每次访问快捷方式这个文件,其实就是在访问源文件
ln -s 源文件 快捷方式文件
# iostat 监视IO负载情况
iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。
更加详细的使用请点击我进行传送 (opens new window)
1.命令:
iostat [ -c ] [ -d ] [ -h ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [ device [...] | ALL ] [ -p [ device [,...] | ALL ] ] [ interval [ count ] ]
00、参数 -d 表示,显示设备(磁盘)使用状态;-k某些使用block为单位的列强制使用Kilobytes为单位;2表示,数据显示每隔2秒刷新一次。
iostat -d -k 2
01、-x iostat还有一个比较常用的选项-x,该选项将用于显示和io相关的扩展数据。
iostat -d -x -k 1 10
描述:
rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
rsec/s:每秒读取的扇区数;
wsec/:每秒写入的扇区数。
rKB/s:The number of read requests that were issued to the device per second;
wKB/s:The number of write requests that were issued to the device per second;
avgrq-sz 平均请求扇区的大小
avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。
await: 每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
svctm 表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长, 系统上运行的应用程序将变慢。
%util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度
。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
02、-c 参数:iostat还可以用来获取cpu部分状态值:
其他:
iostat -d -k 1 10 #查看TPS和吞吐量信息(磁盘读写速度单位为KB)
iostat -d -m 2 #查看TPS和吞吐量信息(磁盘读写速度单位为MB)
iostat -d -x -k 1 10 #查看设备使用率(%util)、响应时间(await) iostat -c 1 10 #查看cpu状态
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# iotop 监视磁盘I/O使用状况的top类工具
iotop命令是一个用来监视磁盘I/O使用状况的top类工具。iotop具有与top相似的UI,其中包括PID、用户、I/O、进程等相关信息。Linux下的IO统计工具如iostat,nmon等大多数是只能统计到per设备的读写情况,如果你想知道每个进程是如何使用IO的就比较麻烦,使用iotop命令可以很方便的查看。
-o:只显示有io操作的进程
-b:批量显示,无交互,主要用作记录到文件。
-n NUM:显示NUM次,主要用于非交互式模式。
-d SEC:间隔SEC秒显示一次。
-p PID:监控的进程pid。
-u USER:监控的进程用户。
iotop常用快捷键:
左右箭头:改变排序方式,默认是按IO排序。
r:改变排序顺序。
o:只显示有IO输出的进程。
p:进程/线程的显示方式的切换。
a:显示累积使用量。
q:退出。
例子:
iotop
iotop -o # 只显示和io有操作的进程
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
补充:top命令,可以指定监控哪个进程的详情:
top -p pid # 可以指定进程进行监控
# tar/zip/unzip 压缩(打包)/解压缩
- [x] tar打包机压缩:
(如果不带z,则表示文件是xx.tar格式)
tar压缩打包:
tar -zcvf 要压缩后的压缩包名称 原文件
tar -zcvf demo.tar.gz demo
解压:
tar -zxvf 压缩包名 # 它会自动解压生成一个文件名
tar -zxvf demo.tar.gz
说明: -c/-x/-t/u 不可同时出现
-c: (create)建立压缩档案
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件
-z:通过gzip方式压缩或解压,最后以.tar.gz 为后缀
-j:通过bzip2方式压缩或解压,最后以xxx.tar.br2 为后缀。压缩后大小小于.tar.gz
-f :使用档名,请留意,在 f 之后要立即接档名!不要再加参数!
如:使用『tar -zcvfP tfile sfile 』就是错误的写法
要写成『 tar -zcvPf tfile sfile』才对喔!
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
参考文章:https://www.jianshu.com/p/7bc8127a5390
命令 | 解压 |
---|---|
tar -zcvf 要压缩后的压缩包名称.tar.gz 原文件 | 压缩方式1 |
tar -jcv -f 压缩文件名称.tar.br2 | 压缩方式2 |
tar -zxvf 压缩包名.tar.gz | 解压文件方式1 |
tar -jxv -f 压缩文件名称.tar.br2 -C 指定文件目录 | 解压文件方式2 |
- [x] zip打包:
zip压缩:如打包目录下所以文件/home/qizai/12306,压缩后文件名为:12306.zip
zip -qr 12306.zip /home/qizai/12306
-q:不显示指令执行过程;
-r:递归处理,将指定目录下的所有文件和子目录一并处理;
zip可选参数:
-A:调整可执行的自动解压缩文件;
-b<工作目录>:指定暂时存放文件的目录;
-c:替每个被压缩的文件加上注释;
-d:从压缩文件内删除指定的文件;
-D:压缩文件内不建立目录名称;
-f:此参数的效果和指定“-u”参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中;
-F:尝试修复已损坏的压缩文件;
-g:将文件压缩后附加在已有的压缩文件之后,而非另行建立新的压缩文件;
-h:在线帮助;
-i<范本样式>:只压缩符合条件的文件;
-j:只保存文件名称及其内容,而不存放任何目录名称;
-J:删除压缩文件前面不必要的数据;
-k:使用MS-DOS兼容格式的文件名称;
-l:压缩文件时,把LF字符置换成LF+CR字符;
-ll:压缩文件时,把LF+cp字符置换成LF字符;
-L:显示版权信息;
-m:将文件压缩并加入压缩文件后,删除原始文件,即把文件移到压缩文件中;
-n<字尾字符串>:不压缩具有特定字尾字符串的文件;
-o:以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该文件相同;
-q:不显示指令执行过程;
-r:递归处理,将指定目录下的所有文件和子目录一并处理;
-S:包含系统和隐藏文件;
-t<日期时间>:把压缩文件的日期设成指定的日期;
-T:检查备份文件内的每个文件是否正确无误;
-u:更换较新的文件到压缩文件内;
-v:显示指令执行过程或显示版本信息;
-V:保存VMS操作系统的文件属性;
-w:在文件名称里假如版本编号,本参数仅在VMS操作系统下有效;
-x<范本样式>:压缩时排除符合条件的文件;
-X:不保存额外的文件属性;
-y:直接保存符号连接,而非该链接所指向的文件,本参数仅在UNIX之类的系统下有效;
-z:替压缩文件加上注释;
-$:保存第一个被压缩文件所在磁盘的卷册名称;
-<压缩效率>:压缩效率是一个介于1~9的数值。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
- [x] unzip解压.zip 格式的文件
解压到当前文件:
unzip 12306.zip
-n解压时不覆盖原有文件
-d解压到指定的目录:
unzip -n test.zip -d /tmp
unzip可选参数:
-c:将解压缩的结果显示到屏幕上,并对字符做适当的转换;
-f:更新现有的文件;
-l:显示压缩文件内所包含的文件;
-p:与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换;
-t:检查压缩文件是否正确;
-u:与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中;
-v:执行时显示详细的信息;
-z:仅显示压缩文件的备注文字;
-a:对文本文件进行必要的字符转换;
-b:不要对文本文件进行字符转换;
-C:压缩文件中的文件名称区分大小写;
-j:不处理压缩文件中原有的目录路径;
-L:将压缩文件中的全部文件名改为小写;
-M:将输出结果送到more程序处理;
-n:解压缩时不要覆盖原有的文件;
-o:不必先询问用户,unzip执行后覆盖原有的文件;
-P<密码>:使用zip的密码选项;
-q:执行时不显示任何信息;
-s:将文件名中的空白字符转换为底线字符;
-V:保留VMS的文件版本信息;
-X:解压缩时同时回存文件原来的UID/GID;
-d<目录>:指定文件解压缩后所要存储的目录;
-x<文件>:指定不要处理.zip压缩文件中的哪些文件;
-Z:unzip-Z等于执行zipinfo指令。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# mysql 查询建表语句
SHOW CREATE TABLE [表名]
| Table | Create Table |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tTM | CREATE TABLE `tTM` (
`nTMId` int(11) NOT NULL AUTO_INCREMENT,
`nTumourId` int(11) NOT NULL,
`nMedicineId` int(11) NOT NULL,
`sCnTSE` text,
`sEnTSE` text,
`sCnAR` text,
`sEnAR` text,
`sCnRD` text,
`sEnRD` text,
`sCnTS` text,
`sEnTS` text,
`sCnDesc` text,
`sEnDesc` text,
PRIMARY KEY (`nTMId`),
KEY `IDX_TM_MID` (`nMedicineId`),
KEY `IDX_TM_TID` (`nTumourId`),
KEY `IDX_TM_MTID` (`nTumourId`,`nMedicineId`)
) ENGINE=InnoDB AUTO_INCREMENT=3031 DEFAULT CHARSET=utf8mb4 |
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 设置控制台显示全路径
设置centos7所有用户都显示全路径
修改/.profile文件,这样做可以在操作的时候显示操作用户以及路径。方法如下:
1、针对所有用户设置可以 /etc/profile中设置
2、针对单个用户设置可以/home/.profile中设置。
以root用户为例:
vi /.profile
PS1='[\u@\h:$PWD]#'
export PS1
修改全部用户的话:
vim /etc/profile
最后增加:
PS1='[\u@\h:$PWD]#'
export PS1
注意需要重启才能生效,这个有点不太好
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 解决服务器80端口被占用
80端口被占用,nginx报错: Nginx [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use)
直接kill掉,使用命令关闭占用80端口的程序
sudo fuser -k 80/tcp
2
PS:这里特指阿里云服务器,占用了80端口,然后每次重启服务器后都要先停掉,才能为我的程序所使用
# 查看所有的僵尸进程
1.使用top先来简单查询一下:
root@k8s-master:~# top
top - 10:40:53 up 70 days, 16:27, 3 users, load average: 0.35, 0.31, 0.36
Tasks: 650 total, 1 running, 442 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.9 us, 0.5 sy, 0.0 ni, 98.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 65868432 total, 37822892 free, 10202376 used, 17843164 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 55193392 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21724 rabbitmq 20 0 21.393g 129944 7052 S 9.9 0.2 9540:03 beam.smp
9709 root 20 0 6140764 126988 65380 S 7.6 0.2 5427:53 kubelet
34400 root 20 0 6593084 128976 48504 S 7.2 0.2 3172:43 dockerd
28213 root 20 0 507068 387060 69752 S 6.2 0.6 4196:06 kube-apiserver
15045 ganglia 20 0 235672 47668 14464 S 4.3 0.1 2599:41 gmond
24634 root 20 0 219656 112496 56924 S 3.0 0.2 1517:26 kube-controller
37625 root 20 0 10.130g 83376 23308 S 2.3 0.1 2406:40 etcd
38746 root 20 0 150736 42192 28364 S 1.6 0.1 235:09.26 coredns
18466 root 20 0 29548 3408 2872 S 1.3 0.0 0:00.04 lsof
15849 root 20 0 17.253g 505368 11952 S 1.0 0.8 30:59.89 java
18371 root 20 0 42308 4224 3152 R 1.0 0.0 0:00.14 top
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
可以看到第二行,最后那里,有个0 zombie
,这个zobie
表示僵尸进程的意思。
所以,使用Top命令查找,当zombie前的数量不为0时,即系统内存在相应数量的僵尸进程。
使用命令 ps -A -ostat,ppid,pid,cmd |grep -e '^[Zz]'
定位僵尸进程以及该僵尸进程的父进程
参数解读:
ps -A -ostat,ppid,pid,cmd |grep -e '^[Zz]'
也可以写为:
ps -A -o stat,ppid,pid,cmd |grep -e '^[Zz]'
-A 参数列出所有进程
-o 自定义输出字段 stat(状态)、ppid(进程父id)、pid(进程id)、cmd(命令)
因为状态为z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程
下面看一下例子(这个不是僵尸进程,僵尸进程是以Z/z开头的):
root@k8s-master:~# ps -A -o stat,ppid,pid,cmd |grep extract
Sl 1 5484 /usr/bin/python3 /usr/local/bdls/report_hualiao/bin/extract_hualiao.py
S+ 40407 5789 tail -f logs/extract_hualiao.log
S+ 21306 26206 grep --color=auto extract
2
3
4
5
6
7
8
9
10
11
12
13
14
15
如何进行批量kill掉:
ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9
参数解读:
awk '{print $2}' 表示只获取第二列
kill -9 表示彻底杀死进程
2
3
4
5
6
# 添加用户相关注意事项
useradd
与adduser
都是创建新的用户
在CentOs
下useradd
与adduser
是没有区别的都是在创建用户,在home
下自动创建目录,没有设置密码,需要使用passwd
命令修改密码。
而在Ubuntu
下useradd
与adduser
有所不同
[x] 1.
useradd
在使用该命令创建用户是不会在/home
下自动创建与用户名同名的用户目录,而且不会自动选择shell版本,也没有设置密码,那么这个用户是不能登录的,需要使用passwd
命令修改密码。[x] 2.
adduser
在使用该命令创建用户是会在/home
下自动创建与用户名同名的用户目录,系统shell
版本,会在创建时会提示输入密码,更加友好。[x]
userdel
删除用户,[x]
userdel
只能删除用户,并不会删除相关的目录文件。userdel -r
可以删除用户及相关目录。
添加用户:
-m 参数是用于在home目录下,一起创建用户的home目录
useradd -m qizai
设置密码:
passwd abc
然后输入你的密码两次
2
3
4
5
6
7
# 查看在线用户、及将其踢下线
查看命令:w
root@develop2:/# w
17:09:40 up 122 days, 23:06, 2 users, load average: 1.07, 1.55, 1.45
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
user1 pts/0 192.168.1.106 Wed10 0.00s 0.38s 0.01s sshd: user1 [priv]
user2 pts/1 192.168.1.104 15:56 1:13m 0.00s 0.00s -sh
2
3
4
5
踢指定用户下线:pkill -KILL -t pts/终端号
root@develop2:/# w
17:11:29 up 122 days, 23:08, 3 users, load average: 1.15, 1.57, 1.48
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
user1 pts/0 192.168.1.106 Wed10 1.00s 0.37s 0.01s sshd: user1 [priv]
user2 pts/1 192.168.1.104 15:56 1:15m 0.00s 0.00s -sh
user1 pts/2 192.168.1.106 17:11 4.00s 0.06s 0.06s -bash
root@develop2:/# pkill -KILL -t pts/2
2
3
4
5
6
7
# 统计目录里有多少个文件
统计指定/当前目录,里面有多少个文件
有三条命令,注意区别使用:
# 1、这个是真实数量,推荐使用这个
root@k8s-master:/usr/local# ls /home/root/ | wc -l
689
# 2、下面两个是比真实情况多1的:
root@k8s-master:/usr/local# ll /home/root/ | wc -l
690
root@k8s-master:/usr/local# find /home/root/ | wc -l
690
2
3
4
5
6
7
8
9
10
- 后续有再补充
参考 Linux命令手册查询网址:https://www.linuxcool.com (opens new window)
打赏一下
「真诚赞赏,手留余香」
# 打赏记录
打赏者 | 打助金额 (元) | 支付方式 | 时间 | 备注 |
---|---|---|---|---|
Arya | 31 | 微信 | 2020-12-23 | Tip of you |
布谷 | 17 | 支付宝 | 2020-12-23 | 码字辛苦了 |