1.管理进程状态
当程序运行为进程后,如果希望停止进程,怎么办呢? 那么此时我们可以使用linux的kill命令对进程发送关闭信号。当然除了kill、还有killall,pkill。
数字编号 | 信号含义 | 信号翻译 |
---|---|---|
1 | SIGHUP | 通常用来重新加载配置文件 |
9 | SIGKILL | 强制杀死进程 |
15 | SIGTERM | 终止进程,默认kill使用该信号 |
1.使用kill命令杀死指定PID的进程。
1.给 vsftpd 进程发送信号 1,15
[root@oldboyedu ~]# yum -y install vsftpd [root@oldboyedu ~]# systemctl start vsftpd [root@oldboyedu ~]# ps aux|grep vsftpd
2.发送重载信号,例如 vsftpd 的配置文件发生改变,希望重新加载
[root@oldboyedu ~]# kill -1 9160
3.发送停止信号,当然vsftpd 服务有停止的脚本 systemctl stop vsftpd
[root@oldboyedu ~]# kill 9160
4.发送强制停止信号,当无法停止服务时,可强制终止信号
[root@oldboyedu ~]# kill -9 9160
2.Linux系统中的killall、pkill命令用于杀死指定名字的进程。我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死的进程,我们还需要在之前使用ps等命令再配合grep来查找进程,而killall、pkill把这两个过程合二为一,是一个很好用的命令。
例1、通过服务名称杀掉进程
[root@oldboyedu ~]# pkill nginx [root@oldboyedu ~]# killall nginx
例2、使用pkill踢出从远程登录到本机的用户,终止pts/0上所有进程, 并且bash也结束(用户被强制退出)
[root@oldboyedu ~]# pkill -9 -t pts/0
2.管理后台进程
1.什么是后台进程
通常进程都会在终端前台运行,一旦关闭终端,进程也会随着结束,那么此时我们就希望进程能在后台运行,就是将在前台运行的进程放入后台运行,这样及时我们关闭了终端也不影响进程的正常运行。
2.我们为什么要将进程放入后台运行
比如:我们此前在国内服务器往国外服务器传输大文件时,由于网络的问题需要传输很久,如果在传输的过程中出现网络抖动或者不小心关闭了终端则会导致传输失败,如果能将传输的进程放入后台,是不是就能解决此类问题了。
3.使用什么工具将进程放入后台
早期的时候大家都选择使用&符号将进程放入后台,然后在使用jobs、bg、fg等方式查看进程状态,但太麻烦了。也不直观,所以我们推荐使用screen。
1.jobs、bg、fg的使用(强烈不推荐,了解即可)
[root@oldboyedu ~]# sleep 3000 & //运行程序(时),让其在后台执行 [root@oldboyedu ~]# sleep 4000 //^Z,将前台的程序挂起(暂停)到后台 [2]+ Stopped sleep 4000 [root@oldboyedu ~]# ps aux |grep sleep [root@oldboyedu ~]# jobs //查看后台作业 [1]- Running sleep 3000 & [2]+ Stopped sleep 4000 [root@oldboyedu ~]# bg %2 //让作业 2 在后台运行 [root@oldboyedu ~]# fg %1 //将作业 1 调回到前台 [root@oldboyedu ~]# kill %1 //kill 1,终止 PID 为 1 的进程 [root@oldboyedu ~]# (while :; do date; sleep 2; done) & //进程在后台运行,但输出依然在当前终端 [root@oldboyedu ~]# (while :; do date; sleep 2; done) &>/dev/null &
2.screen的使用(强烈推荐,生产必用)
1.安装
[root@oldboyedu ~]# yum install screen -y
2.开启一个screen窗口,指定名称
[root@oldboyedu ~]# screen -S wget_mysql
3.在screen窗口中执行任务即可
4.平滑的退出screen,但不会终止screen中的任务。注意: 如果使用exit 才算真的关闭>screen窗口
ctrl+a+d5.查看当前正在运行的screen有哪些
[root@oldboyedu ~]# screen -list There is a screen on: 22058.wget_mysql (Detached) 1 Socket in /var/run/screen/S-root.
6.进入正在运行的screen
[root@oldboyedu ~]# screen -r wget_mysql [root@oldboyedu ~]# screen -r 22058
7.结束screen任务用exit或ctrl+d
3.进程的优先级[进阶]
定义
1.什么优先级
优先级指的是优先享受资源,优先级高的抢占cpu,优先级低的让其他进程先于自己使用cpu
2.为什么要有系统优先级
进程优先级的设置可以使得 --CPU合理的分配运行时间以及如果在系统资源很紧张的时候,设置进程优先级可以很好的保证进程运行不中断!! (比方说,系统很卡的时候,高优先级的进程就不会中断。
3.系统中如何给进程配置优先级?
在启动进程时,为不同的进程使用不同的调度策略。
nice 值越高: 表示优先级越低,例如+19,该进程容易将CPU 使用量让给其他进程。
nice 值越低: 表示优先级越高,例如-20,该进程更不倾向于让出CPU。*
涉及到的命令
1.使用top或ps命令查看进程的优先级
1.使用top可以查看nice优先级。 NI: 实际nice级别,默认是0。 PR: 显示nice值,-20映射到0,+19映射到39
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1083 root 20 0 298628 2808 1544 S 0.3 0.1 2:49.28 vmtoolsd 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:+
2.使用ps查看进程优先级
[root@oldboyedu ~]# ps axo command,nice |grep sshd|grep -v grep /usr/sbin/sshd -D 0 sshd: root@pts/2 0
2.nice指定程序的优先级。语法格式 nice -n 优先级数字 进程名称
1.开启vim并且指定程序优先级为-5
[root@oldboyedu ~]# nice -n -5 vim & [1] 98417
2.查看该进程的优先级情况
[root@oldboyedu ~]# ps axo pid,command,nice |grep 98417 98417 vim -5
3.renice命令修改一个正在运行的进程优先级。语法格式 renice -n 优先级数字 进程pid
1.查看sshd进程当前的优先级状态
[root@oldboyedu ~]# ps axo pid,command,nice |grep 折叠shd 70840 sshd: root@pts/2 0 98002 /usr/sbin/sshd -D 0
2.调整sshd主进程的优先级
[root@oldboyedu ~]# renice -n -20 98002 98002 (process ID) old priority 0, new priority -20
3.调整之后记得退出终端
[root@oldboyedu ~]# ps axo pid,command,nice |grep 折叠shd 70840 sshd: root@pts/2 0 98002 /usr/sbin/sshd -D -20 [root@oldboyedu ~]# exit
4.当再次登陆sshd服务,会由主进程fork子进程(那么子进程会继承主进程的优先级)
[root@oldboyedu ~]# ps axo pid,command,nice |grep 折叠shd 98002 /usr/sbin/sshd -D -20 98122 sshd: root@pts/0 -20
生产案例、Linux出现假死,怎么办,又如何通过nice解决?
4.平均负载
定义:
可以简单理解为,平均负载其实就是单位时间内的活跃进程数。(处于运行+处于等待运行+不可中断的进程)
平均负载和cpu使用率有什么直接的关系?
平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数。所以,它不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程。
而 CPU 使用率,是单位时间内 CPU 繁忙情况的统计,跟平均负载并不一定完全对应。比如:
- CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的;
- I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高;
- 大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。
平均负载高有可能是 CPU 密集型进程导致的;
平均负载高并不一定代表 CPU 使用率高,还有可能是 I/O 更繁忙了;
当发现负载高的时候,你可以使用 mpstat、pidstat 等工具,辅助分析负载的来源