前言
程序的管理除了前文说到的前后台执行,离线执行。还包括下面几个方面:
1:如何找到最耗费系统资源的程序? (使用top命令找到PID然后排查原因)
2:设置程序的优先级,让其被执行的概率增加。(renice nice)
3:如果由于程序写的不好,导致程序僵死,如何找到且处理? (查找CMD后面的defunct标志)
4:灵活以多种方式查找进程
常用命令及效果
ps -l 仅观察自己的 bash 相关程序
其每一个字段的意思如下:
1:F:代表这个程序旗标 (process flags),说明这个程序的总结权
限,常见号码有:
若为 4 表示此程序的权限为 root ;
若为 1 则表示此子程序仅进行复制(fork)而没有实际执行
(exec)。
2:S:代表这个程序的状态 (STAT),主要的状态有:
R (Running):该程序正在运行中;
S (Sleep):该程序目前正在睡眠状态(idle),但可以被
唤醒(signal)。
D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O
的情况(ex>打印)
T :停止状态(stop),可能是在工作控制(背景暂停)或
除错 (traced) 状态;
Z (Zombie):僵尸状态,程序已经终止但却无法被移除至
内存外。
3:UID/PID/PPID:代表“此程序被该 UID 所拥有/程序的 PID 号码/
此程序的父程序 PID 号码”
4:C:代表 CPU 使用率,单位为百分比;
5:PRI/NI:Priority/Nice 的缩写,代表此程序被 CPU 所执行的优先
顺序,数值越小代表该程序越快被 CPU 执行。
6:ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,
指出该程序在内存的哪个部分,如果是个 running 的程序,一般
就会显示“ - ” / SZ 代表此程序用掉多少内存 / WCHAN 表示目前
程序是否运行中,同样的, 若为 - 表示正在运行中。
7:TTY:登陆者的终端机位置,若为远端登陆则使用动态终端接口
(pts/n);
8:TIME:使用掉的 CPU 时间,注意,是此程序实际花费 CPU 运行
的时间,而不是系统时间;
9:CMD:就是 command 的缩写,造成此程序的触发程序之指令为
何。
ps aux 观察系统所有程序
ps -l 与 ps aux 显示的项目并不相同!在 ps aux 显示
的项目中,各字段的意义为:
USER:该 process 属于那个使用者帐号的?
PID :该 process 的程序识别码。
%CPU:该 process 使用掉的 CPU 资源百分比;
%MEM:该 process 所占用的实体内存百分比;
VSZ :该 process 使用掉的虚拟内存量 (KBytes)
RSS :该 process 占用的固定的内存量 (KBytes)
TTY :该 process 是在那个终端机上面运行,若与终端机无关则
显示 ?,另外, tty1-tty6 是本机上面的登陆者程序,若为 pts/0 等
等的,则表示为由网络连接进主机的程序。
STAT:该程序目前的状态,状态显示与 ps -l 的 S 旗标相同
(R/S/T/Z)
START:该 process 被触发启动的时间;
TIME :该 process 实际使用 CPU 运行的时间。
COMMAND:该程序的实际指令为何?
以范例一的显示内容,显示出所有的程序: ps -lA
列出类似程序树的程序显示: ps axjf
可以看到,进程都以树的方式在显示。
显示进程树:pstree
大致用法如下
显示进程树。-a, --arguments 显示命令行参数-A, --ascii 使用 ASCII 行绘制字符-c, --compact-not 不要对完全相同的子树进行压缩-C, --color=类型 按照指定属性对进程上色(age)-g, --show-pgids 显示进程组 ID;隐含启用 -c 选项-G, --vt100 使用 VT100 行绘制字符-h, --highlight-all 高亮显示当前进程和其所有祖先-H PID, --highlight-pid=PID高亮显示指定 PID 对应的进程和其所有祖先-l, --long 不要截断长行-n, --numeric-sort 按照 PID 对输出进行排序-N 类型, --ns-sort=类型按照指定命名空间类型对输出进行排序(cgroup, ipc, mnt, net, pid, user, uts)-p, --show-pids 显示 PID;隐含启用 -c 选项-s, --show-parents 显示所选进程的父进程-S, --ns-changes 显示命名空间的变化-t, --thread-names 显示完整线程名称-T, --hide-threads 隐藏线程,只显示进程-u, --uid-changes 显示用户 ID(UID)的变化-U, --unicode 使用 UTF-8(Unicode)的行绘制字符-V, --version 显示版本信息-Z, --security-context显示 SELinux 安全上下文进程号 从指定进程号开始;默认为 1(init)用户 仅显示从指定用户的进程开始的进程树
显示效果如下。
动态观察程序的变化:top
相对于 ps 是撷取一个时间点的程序状态, top 则可以持续侦测程
序运行的状态!
选项与参数:
-d :后面可以接秒数,就是整个程序画面更新的秒数。默认是 5 秒;
-b :以批次的方式执行 top ,还有更多的参数可以使用喔!
通常会搭配数据流重导向来将批次的结果输出成为文件。
-n :与 -b 搭配,意义是,需要进行几次 top 的输出结果。
-p :指定某些个 PID 来进行观察监测而已。
在 top 执行过程当中可以使用的按键指令:
? :显示在 top 当中可以输入的按键指令;
P :以 CPU 的使用资源排序显示;
M :以 Memory 的使用资源排序显示;
N :以 PID 来排序喔!
T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序。
k :给予某个 PID 一个讯号 (signal)
r :给予某个 PID 重新制订一个 nice 值。
q :离开 top 软件的按键。
将 signal 传送给某个工作 (%jobnumber) 或者是某个PID:kill
一般用法:
ps aux | grep ‘rsyslogd’ | grep -v ‘grep’| awk ‘{print $2}’
kill -1 ps aux | grep ‘rsyslogd’ | grep -v ‘grep’| awk ‘{print $2}’
kill -9 ps aux | grep ‘rsyslogd’ | grep -v ‘grep’| awk ‘{print $2}’
kill -15 ps aux | grep ‘rsyslogd’ | grep -v ‘grep’| awk ‘{print $2}’
批量/全部杀死某类进程:killall
-e,--exact 对长名字要求严格匹配-I,--ignore-case 匹配进程名时忽略大小写-g,--process-group 杀死进程组而不是进程-y,--younger-than 杀死比指定<时间>年轻的进程-o,--older-than 杀死比指定<时间>年老的进程-i,--interactive 在杀死进程前要求确认-l,--list 列出所有的信号名-q,--quiet 不要打印抱怨信息-r,--regexp 将 "进程名" 视为扩展正则表达式-s,--signal 信号 发送指定 "信号" 而不是 SIGTERM-u,--user 用户 仅杀死指定 "用户" 的进程-v,--verbose 报告信号是否成功送出-V,--version 显示版本信息-w,--wait 等待进程死亡-n,--ns 进程号 匹配与指定<进程号>具有相同命名空间的进程-Z,--context 正则表达式 仅杀死含有指定上下文的进程(必须在其他参数前使用)
用法:
范例一:给予 rsyslogd 这个指令启动的 PID 一个 SIGHUP 的讯号
killall -1 rsyslogd
如果用 ps aux 仔细看一下,若包含所有参数,则 /usr/sbin/rsyslogd -n 才是最完整的!
范例二:强制终止所有以 httpd 启动的程序 (其实并没有此程序在系统内)
killall -9 httpd
范例三:依次询问每个 bash 程序是否需要被终止运行!
killall -i -9 bash
Signal bash(13888) ? (y/N) n <==这个不杀!
Signal bash(13928) ? (y/N) n <==这个不杀!
Signal bash(13970) ? (y/N) n <==这个不杀!
Signal bash(14836) ? (y/N) y <==这个杀掉!
具有互动的功能!可以询问你是否要删除 bash 这个程序。要注意,若没有 -i 的参数,
所有的 bash 都会被这个 root 给杀掉!包括 root 自己的 bash 喔! _
设置进程优先级:renice
设置进程优先级有2种方式:
1:一开始执行程序就立即给予一个特定的 nice 值:用 nice 指令;
2:调整某个已经存在的 PID 的 nice 值:用 renice 指令。
范例一:用 root 给一个 nice 值为 -5 ,用于执行 vim ,并观察该程序!
[root@study ~]# nice -n -5 vim &
[1] 19865
[root@study ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 14836 14835 0 90 10 - 29068 wait pts/0 00:00:00 bash
4 T 0 19865 14836 0 85 5 - 37757 signal pts/0 00:00:00 vim
0 R 0 19866 14836 0 90 10 - 30319 - pts/0 00:00:00 ps
#原本的 bash PRI 为 90 ,所以 vim 默认应为 90。不过由于给予 nice 为 -5 ,因此 vim 的 PRI 降低了!RPI 与 NI 各减 5 !但不一定每次都是正好相同喔!因为核心会动态调整
kill -9 %1 <==测试完毕将 vim 关闭
范例二:找出自己的 bash PID ,并将该 PID 的 nice 调整到 -5
[root@study ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 14836 14835 0 90 10 - 29068 wait pts/0 00:00:00 bash
0 R 0 19900 14836 0 90 10 - 30319 - pts/0 00:00:00 ps
[root@study ~]# renice -5 14836
14836 (process ID) old priority 10, new priority -5
[root@study ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 14836 14835 0 75 -5 - 29068 wait pts/0 00:00:00 bash
0 R 0 19910 14836 0 75 -5 - 30319 - pts/0 00:00:00 ps
找到且处理僵尸进程或僵死进程!!
除此之外,我们必须要知道的是“僵尸 (zombie) ”程序是什
么? 通常,造成僵尸程序的成因是因为该程序应该已经执行完毕,
或者是因故应该要终止了, 但是该程序的父程序却无法完整的将该
程序结束掉,而造成那个程序一直存在内存当中。 如果你发现在某
个程序的 CMD 后面还接上 时,就代表该程序是僵尸程
序啦,例如:
使用 ps aux | grep defunct
apache 8683 0.0 0.9 83384 9992 ? Z 14:33 0:00 /usr/sbin/httpd
总结:
这也只是普通的管理进程。还可以通过其他方式观察。
比如:netstat lsof systemctl 等等,这些工具用途不同,各有优点。