2023.6.1 Linux系统进程管理

 

 

01.Linux系统进程管理
什么是进程
进程⽣命周期
监控和管理进程
静态监控进程
动态监控进程
信号管理进程
后台进程管理

什么是进程
进程是已启动的可执⾏程序的运⾏实例,进程有以下组成部分:
分配内存, 已分配内存的地址空间
安全属性, 进程的运⾏身份和权限
进程代码, 运⾏⼀个或多个的线程
进程状态, 进程运⾏后的多种状态
静态程序, ⼆进制⽂件, 静态/bin/ls, /usr/sbin/sshd
动态进程, 程序运⾏的过程, 有⽣命周期及运⾏状态
进程的运⾏环境,包括以下⼏个部分:
局部和全局变量
当前的调度上下⽂
分配给进程使⽤的系统资源,例如⽂件描述符、⽹络端⼝等
给进程分配对应的pid,ppid
进程⽣命周期

 


1. 创建阶段:进程被创建时,⾸先需要通过系统调⽤ fork() 或者 exec() 来创建进程。
2. 就绪阶段:创建进程后,进程被放置在系统的就绪队列中,等待 CPU 的分配。
3. 运⾏阶段:当 CPU 分配给进程后,进程开始执⾏,此时进程的状态变为运⾏状态。


4. 阻塞阶段:当进程在执⾏过程中遇到某些阻塞事件时,例如等待 I/O 操作完成,进程将会进⼊阻塞状态,此时
进程将不再占⽤ CPU 资源。
5. 结束阶段:当进程完成它的任务,或者被终⽌时,它将被系统回收。在这个阶段,进程会被标记为僵⼫进程,
直到⽗进程调⽤ wait() 或 waitpid() 系统调⽤来回收进程资源,最终进程将被彻底销毁。
需要注意的是,进程的⽣命周期并不是线性的,进程状态可以在不同的阶段之间相互转换,例如在运⾏阶段时,进
程可能会因为等待 I/O 操作⽽进⼊阻塞状态,等待 I/O 操作完成后再回到运⾏状态。
监控和管理进程
在多任务处理操作系统中,每个CPU(或核⼼)在⼀个时间点上只能处理⼀个进程。
在进程运⾏时,它对 CPU 时间和资源分配的要求会不断变化,从⽽为进程分配⼀个状态,它随着环境要求⽽改
变。
静态监控进程
静态查看进程通常使⽤ ps 命令
了解进程如下选项:
PID,PPID
当前的进程状态
内存的分配情况
CPU 和已花费的时间
⽤户UID决定进程的特权
[root@wing ~]# ps aux|less
USER    PID %CPU %MEM  VSZ  RSS TTY   STAT START  TIME COMMAND
root     1 0.0 0.3 46276 5836 ?    Ss  Feb27  0:46
/usr/lib/systemd/systemd --system --deserialize 21
USER:  //运⾏进程的⽤户
PID:  //进程 ID
%CPU:  //CPU 占⽤率
%MEM:  //内存占⽤率
VSZ:  //占⽤虚拟内存
RSS:  //占⽤实际内存 驻留内存
TTY:  //进程运⾏的终端
STAT:  //进程状态 man ps (/STATE)
 R  //进程运⾏
 S  //可中断睡眠
 D  //不可中断睡眠
 Z  //僵⼫进程
 X  //进程已经退出
 T  //进程被暂停
 Ss s    //进程的领导者,⽗进程
 S< <    //优先级较⾼的进程
 SN N    //优先级较低的进程
 R+ +    //表示是前台的进程组


ps 命令使⽤⽅法
动态监控进程
 Sl     //以线程的⽅式运⾏
 START:   //进程的启动时间
 TIME:    //进程占⽤ CPU 的总时间
 COMMAND:  //进程⽂件,进程名
//对进程的CPU进⾏排序展示
[root@wing ~]# ps aux --sort %cpu |less
[root@wing ~]# ps aux --sort -%cpu |less
//⾃定义显示字段
[root@wing ~]# ps axo user,pid,ppid,%mem,command |grep nginx
root   122914   1 0.0 nginx: master process nginx
nginx  122915 122914 0.1 nginx: worker process
//显示进程的⼦进程
[root@wing ~]# yum install nginx -y
[root@wing ~]# systemctl start nginx
[root@wing ~]# ps auxf |grep nginx
root   122914 0.0 0.0 46308  956 ?    Ss  17:32  0:00 nginx: master process
nginx
nginx  122915 0.0 0.1 48780 1976 ?    S  17:32  0:00 \_ nginx: worker
process
//查看指定进程PID
[root@wing ~]# ps aux|grep sshd
root    1157 0.0 0.1 105996 3604 ?    Ss  Feb27  0:00 /usr/sbin/sshd -D
[root@wing ~]# cat /run/sshd.pid
1157
//pgrep常⽤参数, -l -a
[root@wing ~]# pgrep sshd
1157
118579
[root@wing ~]# pidof sshd
118579 1157
//查看进程树
[root@wing ~]# pstree
[root@wing ~]# top
[root@wing ~]# top -d 1
[root@wing ~]# top -d 1 -p 10126   查看指定进程的动态信息
[root@wing ~]# top -d 1 -p 10126,1
[root@wing ~]# top -d 1 -u apache  查看指定⽤户的进程

 


系统负载的计算和意义
进程以及⼦进程和线程产⽣的计算指令都会让cpu执⾏,产⽣请求的这些进程组成"运⾏队列",等待cpu执⾏,这个队列
就是系统负载, 系统负载是所有cpu的运⾏队列的总和.
信号管理进程
使⽤kill命令发送信号与进程通信
定义守护进程的⻆⾊
结束⽤户会话和进程
kill,killall,pgrep,pkill
[root@wing ~]# top -d 1 -b -n 2 > top.txt  将 2 次 top 信息写⼊到⽂件
top 常⻅指令
h  查看帮出
z 以彩⾊信息展示
1  显示所有CPU的负载
s  设置刷新时间
b  ⾼亮现实处于R状态的进程
M  按内存使⽤百分⽐排序输出
P  按CPU使⽤百分⽐排序输出
R 对排序进⾏反转
f ⾃定义显示字段
k  kill掉指定PID进程
W 保存top环境设置 ~/.toprc
q  退出
[root@wing ~]# w
20:25:48 up 95 days, 9:06, 1 user, load average: 2.92, 0.00, 0.00
//假设当前计算机有4个核⼼的cpu,当前的负载是2.92
cpu1    cpu2    cpu3    cpu4
2.94/4(个cpu核⼼) = 73%的cpu资源被使⽤,剩下27%的cpu计算资源是空想的
//假设当前的计算有2个核⼼的cpu,当前的负载是2.92
2.92/2 = 146% 已经验证超过了cpu的处理能⼒

 


kill命令发送信号
[root@wing ~]# kill -l //列出所有⽀持的信号
//常⻅信号列表:
数字信号    信号别名    作⽤
1    HUP   挂起信号,往往可以让进程重新配置
2    INT   中断信号,起到结束进程的作⽤,和ctrl + c 的作⽤⼀样
3    QUIT    让进程退出,结果是进程退出
9    KILL    直接结束进程,不能被进程捕获
15   TERM    进程终⽌,这是默认信号
18   CONT    被暂停的进程将继续恢复运⾏
19   STOP    暂停进程
20   TSTP    ⽤户停⽌请求,作⽤类似于ctrl + z 把进程放到后台并暂停
// 给 vsftpd 进程发送信号 1,15
[root@wing ~]# yum -y install vsftpd
[root@wing ~]# systemctl start vsftpd
//发送重启信号,例如 vsftpd 的配置⽂件发⽣改变,希望重新加载
[root@wing ~]# kill -1 9160
//发送停⽌信号,vsftpd 服务有停⽌的脚本 systemctl stop vsftpd
[root@wing ~]# kill 9160
// 给vim进程发送信号 9,15
[root@wing ~]# touch file1 file2
//使⽤远程终端1打开file1
[root@wing ~]# tty
/dev/pts/1
[root@wing ~]# vim file1
//使⽤远程终端2打开file2
[root@wing ~]# tty
/dev/pts/2
[root@wing ~]# vim file2
//查看当前进程pid
[root@wing ~]# ps aux |grep vim
root 4362 0.0 0.2 11104 2888 pts/1 S+ 23:02 0:00 vim file1
root 4363 0.1 0.2 11068 2948 pts/2 S+ 23:02 0:00 vim file2
//发送15信号
[root@wing ~]# kill 4362
//发送9信号
[root@wing ~]# kill -9 4363
//还可以同时给所有vim进程发送信号, 模糊匹配,同时给多个进程发送信号
[root@wing ~]# killall vim
//使⽤pkill踢出从远程登录到本机的⽤户, pkill 类似killall
[root@wing ~]# w

 


后台进程管理
作业控制是⼀个命令⾏功能,允许⼀个 shell 实例来运⾏和管理多个命令。
如果没有作业控制,⽗进程 fork()⼀个⼦进程后,将 sleeping,直到⼦进程退出。
使⽤作业控制,可以选择性暂停,恢复,以及异步运⾏命令,让 shell 可以在⼦进程运⾏期间返回接受其 他命令。
前台进程,后台进程jobs,bg,fg
ctrl + Z , ctrl +c , ctrl + B
nohub
nohub的命令的作⽤是可以将程序以忽略挂起信号的⽅式运⾏。常⻅的⽤法是与&⼀起使⽤,将命令放到后台运
⾏,并且终端挂掉之后还会运⾏。
将程序放到后台运⾏⽤两中⽅法:
1. command & :后台运⾏,关掉终端之后程序会停⽌。
2. nohub command & :后台运⾏,关掉终端程序不会停⽌,还会继续运⾏。
20:50:17 up 95 days, 9:30, 1 user, load average: 0.00, 0.00, 0.00
USER   TTY   FROM       LOGIN@  IDLE  JCPU  PCPU WHAT
wing pts/0  115.175.115.39  20:22  0.00s 0.01s 0.00s sshd: wing [priv]
//终⽌ pts/0上所有进程, 除了bash本身
[root@wing ~]# pkill -t pts/0
//终⽌pts/0上所有进程, 并且bash也结束(⽤户被强制退出)
[root@wing ~]# pkill -9 -t pts/0
//列出wing⽤户的所有进程,-l输出pid
[root@linux-wing ~]# pgrep -l -u wing
32206 sshd
32207 bash
[root@wing ~]# sleep 3000 & //运⾏程序(时),让其在后台执⾏
[root@wing ~]# sleep 4000 //^Z,将前台的程序挂起(暂停)到后台
[2]+ Stopped sleep 4000
[root@wing ~]# ps aux |grep sleep
[root@wing ~]# jobs //查看后台作业
[1]- Running sleep 3000 &
[2]+ Stopped sleep 4000
[root@wing ~]# bg %2   //让作业 2 在后台运⾏
[root@wing ~]# fg %1   //将作业 1 调回到前台
[root@wing ~]# kill %1  //kill 1,终⽌ PID 为 1 的进程
[root@wing ~]# (while :; do date; sleep 2; done) & //进程在后台运⾏,但输出依然在当前终端
[root@wing ~]# (while :; do date; sleep 2; done) &>/dev/null &

 


注意点:
1. 如果使⽤nohub执⾏程序未显示进⾏标准输出流重定向,则标准输出流默认重定向到当前⼯作⽬录的
nohub.out⽂件中。如果当前⼯作⽬录的nohub.out⽂件不可写,输出重定向到$HOME/nohub.out⽂件中。
如果没有⽂件能创建或者打开⽤于追加,那么command参数指定的命令不可调⽤。
2. 如果标准错误未显示重定向,那么标准错误默认重定向到与标准输出相同的⽂件。
通常nohub & 会将⽇志输出到指定⽂件中:
 
标准输出与标准错误输出重定向:
1. 2>&1 标识标准错误输出重定向等同于标准输出重定向,及标准错误输出也重定向到⽂件test.log中。
  2)&命令是命令放在后台执⾏
nohub ./test.sh > test.log &
  nohub ./test.sh > test.log 2>&1 &

posted @ 2023-06-02 01:30  必兮相语--  阅读(122)  评论(0)    收藏  举报