Day26-进程管理核心知识2
1. top选项介绍
【语法格式】top [选项]
参数选项 解释说明(都不重要)
-b 以批处理模式显示进程信息,输出结果可以传递给其他程序或写入到文件中。
-c 显示进程的整个命令路径,而不是只显示命令名称
-d 指定每两次屏幕信息刷新之间的时间间隔(top -d 1)
-n top输出信息更新的次数,完成后将退出top命令
-p 显示指定的进程信息(top -p 进程号)
-u 指定用户的进程(搭建集群的时候可能会把程序跑在普通用户下)
1)指定pid查看进程
[root@oldboy ~]# pgrep sshd
1374
1641
13003
[root@oldboy ~]# top -p 1374
2)指定用户查看进程
[root@oldboy ~]# top -u oldboy
top - 21:58:42 up 4 days, 23:33, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 107 total, 1 running, 106 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 4026136 total, 190492 free, 229320 used, 3606324 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 3522556 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
79410 oldboy 20 0 116588 2960 1656 S 0.0 0.1 0:00.01 bash
79435 oldboy 20 0 4364 352 280 S 0.0 0.0 0:00.00 sleep
3)间隔1秒刷新,一共2次,然后写到文件里
top -d 1 -b -n 2 > top.txt
然后用awk取列,然后sort排序。
4)top -a 显示程序全路径
企业面试:输入top命令以后,想看服务器有几个CPU核心?
答:按1键。
load average 平均负载 * *
2. 进程的三个杀手。
1)kill 通过发送信号,通过PID杀掉进程
2)killall 通过进程名字
3)pkill 通过进程名称(完整名称)
2.1 kill
kill 终止你希望停止的进程。
-l 列出全部的信号名称
-s 指定要发送的信号※
什么是信号?
kill命令发给操作系统,让操作系统去执行的一个指令.
[root@oldboy ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
常见信号列表:
数字信号 信号别名 作用
1 HUP 挂起信号 往往可以让进程重新配置,重新加载
2 INT 中断信号,起到结束进程的作用,和ctrl+c的作用一样
3 QUIT 让进程退出,结果是进程退出
9 KILL 直接结束进程,不能被进程捕获(强制杀死,慎用)
15 TERM 进程终止,这是默认信号
18 CONT 被暂停的进程将继续恢复运行
19 STOP 暂停进程
20 TSTP 用户停止请求,作用类似于ctrl+z 把进程放到后台并暂停 #后台挂起
环境测试:
[root@oldboy ~]# rpm -qa vsftpd
vsftpd-3.0.2-27.el7.x86_64
[root@oldboy ~]# yum install -y vsftpd
软件名:vsftpd FTP服务,连接用21,数据端口20
[root@oldboy ~]# systemctl start vsftpd
[root@oldboy ~]# netstat -lntup|grep vsftp
tcp6 0 0 :::21 :::* LISTEN 66822/vsftpd
默认不加参数关闭vsftpd
[root@oldboy ~]# pgrep vsftpd
66822
[root@oldboy ~]# kill 66822
[root@oldboy ~]# pgrep vsftpd
kill杀不死的时候
可以用kill -9 进程名 #强制杀
生产经验:
1.强制杀,导致服务起不来。一般不要操作,宁愿等一会。
2.数据服务不能强杀, mysql,oracle,mongodb(数据库里,磁盘上有自己的文件系统),千万别强杀。
3.非数据服务可以强杀,nginx,vsftpd(数据在磁盘上)
[root@oldboy ~]# kill -9 `pgrep vsftpd`
[root@oldboy ~]# pgrep vsftpd
改配置文件不重启,直接生效
1 HUP 挂起信号 往往可以让进程重新配置,重新加载
kill -1 进程ID
发送重启信号,例如 vsftpd 的配置文件发生改变,希望重新加载
[root@oldboyedu ~]# kill -1 9160
发送停止信号,vsftpd 服务有停止的脚本 systemctl stop vsftpd
模拟ctrl+z快捷键,暂停进程并放入后台。
[root@oldboy ~]# kill -20 79658
[oldboy@oldboy ~]$ sleep 100
[1]+ Stopped sleep 100
继续运行
[oldboy@oldboy ~]$ bg 1
[1]+ sleep 100 &
NGINX 有关KILL生产经验:
启动nginx服务(需要提前编译)
[root@oldboy ~]# /application/nginx/sbin/nginx
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
查看80端口是什么服务?
[root@oldboy ~]# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 74537 root 6u IPv4 397649 0t0 TCP *:http (LISTEN)
nginx 74538 nobody 6u IPv4 397649 0t0 TCP *:http (LISTEN)
[root@oldboy ~]# netstat -lntup|grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 74537/nginx: master
netstat参数
-l 监听
-n 数字显示
-t tcp
-u udp
-p 进程名
nginx服务有关kill信号:
1、测试配置文件是否有异常:
/application/nginx/sbin/nginx -t
2、启动:
/application/nginx/sbin/nginx
3、指定配置文件启动:
/application/nginx/sbin/nginx -c /application/nginx/conf/nginx.conf
重点:
4、重新打开日志:
kill -USR1 `cat /application/nginx/logs/nginx.pid` #进程号
5、发送【平滑】升级信号:
(银行服务:17点下班了,没有进去的不能进,已经进去的继续服务)
kill -USR2 `cat /application/nginx/logs/nginx.pid`
6、平缓停止worker process
kill -WINCH `cat /application/nginx/logs/nginx.pid.oldbin`
7、停止老的进程
kill -QUIT `cat /application/nginx/logs/nginx.pid.oldbin`
生产经验:
判断进程是否存在方法1:
kill -0 pid #是不发送关闭停止信号,但是会检查进程是否存在。
生产用途:检查进程是否存在。实际应用,mysql服务关闭的时候。
kill PID
以后学习shell脚本开发,关闭服务的时候,就可以用kill -0
如果vsftpd存在则输出1,否则输出0
[root@oldboy ~]# kill -0 `pgrep vsftpd` 2>/dev/null && echo 1||echo 0
1
杀掉vsftpd
[root@oldboy ~]# killall vsftpd
检查
[root@oldboy ~]# kill -0 `pgrep vsftpd` 2>/dev/null && echo 1||echo 0
0
[root@oldboy ~]# pgrep vsftpd
判断进程是否存在方法2:
[root@oldboy ~]# pgrep vsftpd &>/dev/null&&echo 1||echo 0
1
[root@oldboy ~]# killall vsftpd
[root@oldboy ~]# pgrep vsftpd &>/dev/null&&echo 1||echo 0
0
2.2 killall 通过进程名字 kill processes by name
killall 进程名
连着执行直到看到后面提示no process found
[root@oldboy ~]# killall nginx
[root@oldboy ~]# killall nginx
nginx: no process found
killall -9 进程名
killall -u 用户
问题:杀死很慢。。不断重复执行
2.3 pkill 通过进程名称(完整名称)
pkill [选项] [进程名]
-t 终端 杀死指定终端进程※
-u 用户 杀死指定用户的进程※
[root@oldboy ~]# pgrep vsftpd &>/dev/null&&echo 1||echo 0
0
[root@oldboy ~]# systemctl start vsftpd
[root@oldboy ~]# pgrep vsftpd &>/dev/null&&echo 1||echo 0
1
[root@oldboy ~]# pkill vsftpd #杀进程名
[root@oldboy ~]# pgrep vsftpd &>/dev/null&&echo 1||echo 0
0
[root@oldboy ~]# ps -ef|grep vsftp
root 79996 1645 0 23:46 pts/0 00:00:00 grep --color=auto vsftp
[root@oldboy ~]# ps -ef|grep vsftp|grep -v grep|wc -l
0
[root@oldboy ~]# systemctl start vsftpd
[root@oldboy ~]# ps -ef|grep vsftp|grep -v grep|wc -l
1
[root@oldboy ~]# ps -ef|grep vsftp|grep -v grep
root 80008 1 0 23:46 ? 00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
指定用户:
[root@oldboy ~]# pkill -u oldboy crond
[root@oldboy ~]#
[root@oldboy ~]# pkill -u oldboy crond
-t 终端 杀死指定终端进程※
[root@oldboy ~]# pkill -t pts/1
[oldboy@oldboy ~]$ bg 1
Session terminated, killing shell... ...killed.
重点总结:
pkill 进程名 #一次杀死
killall 进程名 #多次。
-9 强杀 会引起服务起不来
-u 用户
kill PID #默认不会引起服务起不来。
kill -HUP PID #平滑重启(重新加载配置。)
kill -0 PID #检查进程是否存在。实际应用,mysql服务关闭的时候。
kill -9 PID #强杀 #可能会引起服务起不来
sed -i.bak 's#worker_processes 1;#worker_processes 16;#g' /application/nginx/conf/nginx.conf|grep work
批量杀进程
ps -ef|grep nginx|awk '{print $2}'|sed -r 's#(.*)#kill \1#g'|bash
【进程前后台切换】
- 为什么要学习进程前后台切换?
1)远程拷贝大文件,持续时间长的操作。
为了防止中断,一般要放在后台运行。
2)有些进程需要定时执行
3)需要一直运行(守护进程)。 - 命令或操作
ctrl+z 暂停当前进程。
bg 放入后台。
fg 拿回前台。
jobs 查看当前队列,含ID。
人工执行的程序,前后台切换
- 启动命令(默认放后台),加参数放到后台。
- shell脚本(命令)放后台
kill %id
睡觉:
sleep 1 #数字秒数,1秒
usleep 1000 #微秒,1毫秒
shell脚本(命令)放后台
方法2:使用&符号。
sleep 200 & #放后台运行,脚本或命令要全路径。
nohup:用户退出系统进程继续工作
【功能说明】
nohup命令可以将程序以忽略挂起信号的方式运行起来,被运行程序的输出信息将不会显示到终端。
无论是否将nohup命令的输出重定向到终端,输出都将写入到当前目录的nohup.out 文件中。
如果当前目录的nohup.out文件不可写,输出重定向到$HOME/nohup.out文件中。
企业应用:
nohup 路径/shell脚本 &
方法3:screen
总结:让程序进入后台运行方法
- ctrl+z,jobs,fg,bg前台的程序,进入后台,后台运行 ##临时用
- 使用screen (推荐) ##管理员常用,下班了想回家,xshell有没有执行完的任务。
- 使用&符号 ##后台运行脚本常用
3. screen命令
作用:保持操作过的窗口连接状态。
1.安装
[root@oldboy ~]# yum install screen -y
2.开启一个screen窗口,指定名称
[root@oldboy ~]# screen -S sleep
3.在screen窗口中执行任务即可
while true;do echo oldboy >>/tmp/oldboy.log;sleep 1;done
#每隔一秒向/tmp/oldboy.log追加oldboy
4.平滑的退出screen,但不会终止screen中的任务。
ctrl+a+d
注意: 如果使用exit 才算真的关闭screen窗口
5.关闭xshell模拟下班回家,
第二天重开xshell连接。
查看当前正在运行的screen有哪些
[root@oldboy ~]# screen -list
There is a screen on:
22058.sleep (Detached)
1 Socket in /var/run/screen/S-root.
6.此时需要进入昨晚的会话,进入正在运行的screen
[root@oldboy ~]# screen -r sleep
[root@oldboy ~]# screen -r 22058
常用screen参数
screen -S yourname #新建一个叫yourname的session
screen -ls #列出当前所有的session
screen -r yourname #回到yourname这个session
screen -d yourname #远程detach某个session
screen -d -r yourname #结束当前session并回到yourname这个session
重点总结:
1.创建screen 创建
screen 或 screnn -S 窗口名称
2.退出窗口
ctrl+a+d
3.显示当前所有screen窗口
screen -ls
4.恢复,重新进入
screnn -r id
4. 什么是进程优先级?
进程执行时候是排队执行的,需要插队,要调整。
进程重要性高,需要优先多分配CPU。调整优先级。
#%1 #记住用途
nice: 调整【程序运行时】的优先级
renice:调整【运行中的进程】的优先级
区别:
nice命令常用于修改未运行的程序再运行时的优先级,
但是对于正在运行的进程,若想要修改优先级,就需要用到renice命令。
5. strace:跟踪进程的系统调用 *
系统调用:系统为应用程序提供的连接接口
进程执行:调用很多接口。。
为什么要跟踪进程的系统调用?
查找进程执行异常的原因:
PHP进程,JAVA进程,cpu%100,怎么排查?
进程执行:调用很多接口,接口如果异常,进程就会不正常。。
strace是Linux环境下的一款程序调试工具,用来检查一个应用程序所使用的系统调用及它所接收的系统信息。strace会追踪程序运行时的整个生命周期,输出每一个系统调用的名字、参数、返回值和执行消耗的时间等,是高级运维和开发人员的排查问题的杀手锏。
-p pid 指定要跟踪的进程pid, 要同时跟踪多个pid, 重复多次-p选项即可※
-f 跟踪目标进程,以及目标进程创建的所有子进程※
-tt 在输出中的每一行前加上时间信息,精确到微秒。例子:11:18:59.759546※
范例1:排查Nginx 403 forbidden错误。
[root@LNMP ~]# strace -tt -f /application/nginx/sbin/nginx
范例2:只跟踪和文件操作有关的系统调用。
范例1的命令结果输出太多了,很容易看花眼,因此可以使用过滤器,过滤掉无关信息,比如只查看文件操作信息。
[root@LNMP ~]# strace -tt -f -e trace=file /application/nginx/sbin/nginx #<==-e trace=file的作用为只跟踪和文件操作有关的系统调用。
[root@oldboy ~]# strace -tt -p 80008
范例3:跟踪系统调用统计。
strace不仅能追踪系统调用,使用选项-c还能将进程所有的系统调用做一个统计分析。
[root@LNMP ~]# strace -c /application/nginx/sbin/nginx #<==使用-c参数给进程所有的系统调用做一个统计分析。
使用-o选项将strace的结果输出到文件中
strace -c -o tongji.log /application/nginx/sbin/nginx
小结:strace命令很适合程序僵尸、命令执行报错等的问题,如果从程序日志和系统日志中看不出问题出现的原因,就可以strace一下,也许有答案,不过也需要使用者有足够的耐心去查看输出!
案例1:给/etc/passwd加锁,然后用strace追踪。
[root@oldboy ~]# chattr +i /etc/passwd
[root@oldboy ~]# strace -f useradd abc
发现问题:无法打开/etc/passwd
open("/etc/passwd", O_RDWR|O_NOCTTY|O_NONBLOCK|O_NOFOLLOW) = -1 EACCES (Permission denied)
write(2, "useradd: cannot open /etc/passwd"..., 33useradd: cannot open /etc/passwd
企业案例:PHP进程CPU百分百了。请问你怎么解决?
1)pgrep 进程,获取进程号
2)strace -p 进程号 发现问题。
用户案例:
链接: https://blog.csdn.net/msllws/article/details/107090542
strace关键词。
参数选项 | 解释说明 (带*的为重点) |
---|---|
-c | 统计每一系统调用的所执行的时间,次数和出错的次数等 |
-d | 输出strace关于标准错误的调试信息 |
-f | 跟踪目标进程,以及目标进程创建的所有子进程***** |
-ff | 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号 |
-i | 输出系统调用的入口指针 |
-q | 禁止输出关于脱离的消息 |
-r | 输出每一个系统调用的相对时间 |
-t | 在输出中的每一行前加上时间信息。例子: 16:45:28 |
-tt | 在输出中的每一行前加上时间信息,精确到微秒。例子: 11:18:59.759546***** |
-T | 显示每次系统调用所花费的时间 |
-o | filename 将strace的输出写入文件filename***** |
-p | pid 指定要跟踪的进程pid,要同时跟踪多个pid,重复多次-p选项即可***** |
-s | strsize 指定输出的字符串的最大长度,默认为32。文件名没有被视为字符串,默认全部输出 |
-u | username 以username的UID和GID执行被跟踪的命令 |
-e expr 输出过滤器,通过表达式,可以过滤掉你不想要的输出
expr是一个表达式,用来控制如何跟踪:[qualifier=][!]value1[,value2]…
说明:
1、qualifier只能是trace,abbrev,verbose,raw,signal,read,write其中之一
2、value是用来限定的符号或数字
3、默认的qualifier是trace
4、感叹号是否定符号
例如:
-e open等价于 -e trace=open,表示只跟踪open调用
而-e trace!=open表示跟踪除了open以外的其他调用
常见选项:
参数选项 | 解释说明 |
---|---|
-e trace=[set] | 只跟踪指定的系统调用 |
-e trace=file | 只跟踪和文件操作有关的系统调用***** |
-e trace=process | 只跟踪和进程控制有关的系统调用 |
-e trace=network | 只跟踪和网络有关的系统调用 |
-e trace=signal | 只跟踪和系统信号有关的系统调用 |
-e trace=desc | 只跟踪和文件描述符有关的系统调用 |
-e trace=ipc | 只跟踪和进程通讯有关的系统调用 |
-e abbrev=[set] | 设定strace输出的系统调用的结果集 |
-e raw=[set] | 将指定的系统调用的参数以十六进制显示 |
-e signal=[set] | 指定跟踪的系统信号 |
-e read=[set] | 输出从指定文件中读出的数据 |
-e write=[set] | 输出写入到指定文件中的数据 |
企业生产经验:
资源不够用:网站运行慢。
- 没有给充足资源。
上线前压测,提前测出来承受能力。
提前预警。70% 预警时间是(资源增加的最长周期+当下百分比<80%)。 - 开发代码上线,BUG异常消耗资源,导致100%
strace,gdb.后知后觉。 - 公司推广部门(合作广告),大流量过来,广告页(CDN),(提前准备)。
运维感受到的:服务器流量增加,压力增大,CPU ,内存,磁盘都压力很大了。
所有和网站相关的部门,开发,运维、运营、市场,客服(查询 离线查询,和生产用户访问库,分开)
对于外部用户,检测,根据趋势预判。
top
ps
pstree
pgrep
kill
killall
pkill
strace
ltrace
bg
fg
jobs
kill %
screen
nohup
&
lsof
netstat
nice命令常用于修改未运行的程序再运行时的优先级
renice调整【运行中的进程】的优先级
uptime
w
ltrace:跟踪进程调用库函数
ltrace 能够跟踪进程的库函数调用,它会显现出哪个库函数被调用,而strace则是跟踪进程的每个系统调用。
参数选项 解释说明(带※的为重点)
-c 统计库函数每次调用时间,最后程序退出时打印摘要
-C 解码低级别名称(内核级)为用户级名称
-d 打印调试信息
-e expr 输出过滤器,通过表达式,可以过滤掉你不想要的输出※
-e printf 表示只查看printf函数调用
-e !printf 表示查看除printf函数以外的所有函数调用
-f 跟踪子进程
-o filename 将ltrace的输出写入文件filename
-p pid 指定要跟踪的进程pid※
-r 输出每一个调用的相对时间
-S 显示系统调用
-t 在输出中的每一行前加上时间信息。例子:16:45:28
-tt 在输出中的每一行前加上时间信息,精确到微秒。例子:11:18:59.759546
-ttt 在输出中的每一行前加上时间信息,精确到微秒,而且时间表示为unix时间戳。
例子:1486111461.650434
-T 显示每次调用所花费的时间
-u username 以username 的UID和GID执行被跟踪的命令
ltrace -o nginx.log /application/nginx/sbin/nginx