什么是进程
进程生命周期
监控和管理进程
静态监控进程
动态监控进程
信号管理进程
后台进程管理
什么是进程
进程是已启动的可执行程序的运行实例,进程有以下组成部分:
分配内存, 已分配内存的地址空间
安全属性, 进程的运行身份和权限
进程代码, 运行一个或多个的线程
进程状态, 进程运行后的多种状态
静态程序, 二进制文件, 静态/bin/ls, /usr/sbin/sshd
动态进程, 程序运行的过程, 有生命周期及运行状态
进程的运行环境,包括以下几个部分:
局部和全局变量
当前的调度上下文
分配给进程使用的系统资源,例如文件描述符、网络端口等
给进程分配对应的 pid,ppid
进程生命周期
程序运行时进程的状态关系:
父进程复制自己的地址空间创建新的子进程, 子进程可以继承父进程(ppid)的环境变量
每个进程都有自己的唯一 ID(PID)
进程是由 systemd 这个父进程派生出来的子进程
子进程在运行自己的程序代码的时候, 父进程往往会进入到睡眠状态
子进程完成程序代码发出退出信号请求
子进程已经关闭或丢弃了其资源环境, 剩余的部分称之为僵停(僵尸 Zombie)
父进程在子进程退出时收到信号会被唤醒, 清理剩余的结构,然后继续执行其自己的程序代码
监控和管理进程
在多任务处理操作系统中,每个 CPU(或核心)在一个时间点上只能处理一个进程
在进程运行时,它对 CPU 时间和资源分配的要求会不断变化,从而为进程分配一个状态,它随着环境要求而改变
静态监控进程
静态查看进程通常使用 ps 命令
了解进程如下选项:
PID,PPID
当前的进程状态
内存的分配情况
CPU 和已花费的时间
用户 UID 决定进程的特权
[root@liza ~]# 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+ + //表示是前台的进程组
Sl //以线程的方式运行
START: //进程的启动时间
TIME: //进程占用 CPU 的总时间
COMMAND: //进程文件,进程名
复制代码
ps 命令使用方法
对进程的 CPU 进行排序展示
[root@liza ~]# ps aux --sort %cpu |less
[root@liza ~]# ps aux --sort -%cpu |less
复制代码
自定义显示字段
[root@liza ~]# ps axo user,pid,ppid,%mem,command |grep nginx
root 14724 14498 0.0 grep --color=auto nginx
复制代码
显示进程的子进程
[root@liza ~]# yum install -y httpd
[root@liza ~]# systemctl restart httpd
[root@liza ~]# ps auxf | grep httpd
root 14940 0.0 0.0 112660 972 pts/1 S+ 15:55 0:00 \_ grep --color=auto httpd
root 14915 0.0 0.2 226240 5164 ? Ss 15:54 0:00 /usr/sbin/httpd -DFOREGROUND
apache 14925 0.0 0.1 228324 3156 ? S 15:55 0:00 \_ /usr/sbin/httpd -DFOREGROUND
apache 14926 0.0 0.1 228324 3156 ? S 15:55 0:00 \_ /usr/sbin/httpd -DFOREGROUND
apache 14927 0.0 0.1 228324 3156 ? S 15:55 0:00 \_ /usr/sbin/httpd -DFOREGROUND
apache 14928 0.0 0.1 228324 3156 ? S 15:55 0:00 \_ /usr/sbin/httpd -DFOREGROUND
apache 14929 0.0 0.1 228324 3156 ? S 15:55 0:00 \_ /usr/sbin/httpd -DFOREGROUND
复制代码
查看指定进程 PID
[root@liza ~]# ps aux | grep sshd.pid
root 14942 0.0 0.0 112660 980 pts/1 S+ 15:56 0:00 grep --color=auto sshd.pid
[root@liza ~]# cat /run/sshd.pid
1250
复制代码
pgrep 常用参数, -l -a
[root@liza ~]# pgrep sshd
1250
14494
[root@liza ~]# pidof sshd
14494 1250
复制代码
查看进程树
动态监控进程
[root@liza ~]# top
[root@liza ~]# top -d 1
[root@liza ~]# top -d 1 -p 10126
[root@liza ~]# top -d 1 -p 10126,1
[root@liza ~]# top -d 1 -u apache
[root@liza ~]# top -d 1 -b -n 2 > top.txt
复制代码
top 常见指令
h 查看帮出
z 以彩色信息展示
1 显示所有CPU的负载
s 设置刷新时间
b 高亮现实处于R状态的进程
M 按内存使用百分比排序输出
P 按CPU使用百分比排序输出
R 对排序进行反转
f 自定义显示字段
k kill掉指定PID进程
W 保存top环境设置 ~/.toprc
q 退出
系统负载的计算和意义
进程以及子进程和线程产生的计算指令都会让 cpu 执行,产生请求的这些进程组成”运行队列”,等待 cpu 执行,这个队列就是系统负载, 系统负载是所有 cpu 的运行队列的总和
[root@liza ~]# w
16:04:41 up 30 min, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root :0 :0 03Jan21 ?xdm? 28.35s 0.10s /usr/libexec/gnome-session-binary --session gnome-classic
root pts/1 192.168.112.1 15:37 1.00s 0.30s 0.02s w
复制代码
假设当前计算机有 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 命令发送信号与进程通信
定义守护进程的角色
结束用户会话和进程
kill
,killall
,pgrep
,pkill
列出所有支持的信号
[root@liza ~]# 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 把进程放到后台并暂停
后台进程管理
作业控制是一个命令行功能,允许一个 shell 实例来运行和管理多个命令。
如果没有作业控制,父进程 fork()一个子进程后,将 sleeping,直到子进程退出。
使用作业控制,可以选择性暂停,恢复,以及异步运行命令,让 shell
可以在子进程运行期间返回接受其他命令。
前台进程,后台进程jobs
,bg
,fg ctrl + Z
,ctrl + C
, ctrl + B
运行程序(时),让其在后台执行
[root@liza ~]# sleep 3000 &
[1] 15235
复制代码
将前台的程序挂起(暂停)到后台
[root@liza ~]# sleep 4000
[2]+ Stopped sleep 4000
[root@liza ~]# ps aux |grep sleep
root 15235 0.0 0.0 107904 348 pts/1 S 16:14 0:00 sleep 3000
root 15243 0.0 0.0 107904 612 ? S 16:14 0:00 sleep 60
root 15247 0.0 0.0 112660 972 pts/1 S+ 16:15 0:00 grep --color=auto sleep
复制代码
查看后台作业查
[root@liza ~]# jobs
[1]- Running sleep 3000 &
[2]+ Stopped sleep 4000
复制代码
让作业 2 在后台运行
将作业 1 调回到前台
kill 1,终止 PID 为 1 的进程
进程在后台运行,但输出依然在当前终端
[root@liza ~]# (while :; do date; sleep 2; done) &
[root@liza ~]# (while :; do date; sleep 2; done) &>/dev/null &
[2] 15376
[1] Terminated ( while :; do
date; sleep 2;
done )
复制代码
评论