目录
Linux系统上的进程查看及管理工具:pstree, ps, pidof, pgrep, top, htop, glances, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup, nice, renice, killall等等
进程文件/proc/PID
linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中
进程:
/proc/#:
[root@localhost ~]# ll /proc/56460
total 0
dr-xr-xr-x. 2 apache apache 0 Nov 22 11:57 attr
-rw-r--r--. 1 root root 0 Nov 23 20:42 autogroup
-r--------. 1 root root 0 Nov 23 20:42 auxv
-r--r--r--. 1 root root 0 Nov 23 20:42 cgroup
--w-------. 1 root root 0 Nov 23 20:42 clear_refs
-r--r--r--. 1 root root 0 Nov 22 03:09 cmdline
-rw-r--r--. 1 root root 0 Nov 23 20:42 comm
-rw-r--r--. 1 root root 0 Nov 23 20:42 coredump_filter
-r--r--r--. 1 root root 0 Nov 23 20:42 cpuset
lrwxrwxrwx. 1 root root 0 Nov 23 20:42 cwd -> /
-r--------. 1 root root 0 Nov 23 20:42 environ
lrwxrwxrwx. 1 root root 0 Nov 23 10:33 exe -> /usr/sbin/httpd
...
PS
ps - report a snapshot of the current processes.静态的快照信息。
ps [options]:
选项有三种风格:
1 UNIX options, which may be grouped and must be preceded by a dash.
2 BSD options, which may be grouped and must not be used with a dash.
3 GNU long options, which are preceded by two dashes.
启动进程的方式:
系统启动过程中自动启动:与终端无关的进程;
用户通过终端启动:与终端相关的进程;
选项:
a:所有与终端相关的进程;
x:所有与终端无关的进程;
u:以用户为中心组织进程状态信息显示;
常用组合之一:aux
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.4 0.4 210440 9280 ? Ss Jun17 877:11 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S Jun17 2:31 [kthreadd]
root 4 0.0 0.0 0 0 ? S< Jun17 0:00 [kworker/0:0H]
以用户为中心的进程信息,字段信息:
VSZ:虚拟内存集;
RSS:Resident Size,常驻内存集(不能被交换出去的),一般虚拟内存集大于常驻内存集。
STAT:进程状态
R:running
S:interruptable sleeping(可中断睡眠)
D:uninterruptable sleeping(不可中断睡眠)
T:Stopped (停止)
Z:zombie (僵尸态)
+:前台进程
l:多线程进程
N:低优先级进程
<:高优先级进程
s:session leader
Ss s进程的领导者,父进程
S< <优先级较高的进程
SN N优先级较低的进程
R+ +表示是前台的进程组
Sl 以线程的方式运行
TIME:运行的累积时长
COMMAND:由什么命令启动的进程
root@localhost ~]# ps x
PID TTY STAT TIME COMMAND
1 ? Ss 877:08 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
2 ? S 2:31 [kthreadd]
4 ? S< 0:00 [kworker/0:0H]
6 ? S 9:08 [ksoftirqd/0]
7 ? S 0:04 [migration/0]
8 ? S 0:00 [rcu_bh]
9 ? S 585:51 [rcu_sched]
以上命令显示与终端无关的进程信息,因此tty显示问号,最后一列中括号括起来的标识内核程序的线程(轻量级的进程,一个进程可分为多个线程,以实现并行运行程序)
-e:显示所有进程
-f:显示完整格式的进程信息
常用组合之二:-ef
[root@localhost ~]# ps -ef|head
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Jun17 ? 15:49:12 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 Jun17 ? 00:02:34 [kthreadd]
root 4 2 0 Jun17 ? 00:00:00 [kworker/0:0H]
root 6 2 0 Jun17 ? 00:09:22 [ksoftirqd/0]
root 7 2 0 Jun17 ? 00:00:04 [migration/0]
root 8 2 0 Jun17 ? 00:00:00 [rcu_bh]
root 9 2 0 Jun17 ? 10:14:01 [rcu_sched]
root 10 2 0 Jun17 ? 00:00:00 [lru-add-drain]
root 11 2 0 Jun17 ? 00:12:16 [watchdog/0]
-F:显示完整格式的进程信息;
C: cpu utilization
PSR:运行于哪颗CPU之上
-H:以层级结构显示进程的相关信息;
常用组合之三:-eFH
[root@localhost ~]# ps -eFH |head
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
root 2 0 0 0 0 6 Jun17 ? 00:02:31 [kthreadd]
root 4 2 0 0 0 0 Jun17 ? 00:00:00 [kworker/0:0H]
root 6 2 0 0 0 0 Jun17 ? 00:09:08 [ksoftirqd/0]
root 7 2 0 0 0 0 Jun17 ? 00:00:04 [migration/0]
root 8 2 0 0 0 0 Jun17 ? 00:00:00 [rcu_bh]
root 9 2 0 0 0 0 Jun17 ? 09:45:55 [rcu_sched]
root 10 2 0 0 0 0 Jun17 ? 00:00:00 [lru-add-drain]
root 11 2 0 0 0 0 Jun17 ? 00:12:03 [watchdog/0]
root 12 2 0 0 0 1 Jun17 ? 00:04:00 [watchdog/1]
字段PSR:运行的CPU核心
常用组合之四:-eo, axo
o field1, field2,...:自定义要显示的字段列表,以逗号分隔;
常用的field:pid, ni, pri, psr, pcpu, stat, comm, tty, ppid, rtprio
ni:nice值;
priority:priority, 优先级;
rtprio:real time priority,实时优先级;
[root@localhost ~]# ps axo pid,ppid,ni,pri,rtprio,stat,comm
PID PPID NI PRI RTPRIO STAT COMMAND
1 0 0 19 - Ss systemd
2 0 0 19 - S kthreadd
4 2 -20 39 - S< kworker/0:0H
6 2 0 19 - S ksoftirqd/0
7 2 - 139 99 S migration/0
8 2 0 19 - S rcu_bh
9 2 0 19 - S rcu_sched
10 2 -20 39 - S< lru-add-drain
11 2 - 139 99 S watchdog/0
pgrep, pkill
- look up or signal processes based on name and other attributes
pgrep [options] pattern
-u uid:effective user
-U uid:read user
-t TERMINAL:与指定的终端相关的进程;
-l:显示进程名;
-a:显示完整格式的进程名;
-P pid:显示此进程的子进程;
pidof
根据进程名,取其pid;
[root@localhost ~]# pidof httpd
56464 56463 56462 56461 56460 13766
[root@localhost ~]# pidof systemd
1
top
- display Linux processes
排序:
P:以占据CPU百分比排序;
M:以占据内存百分比排序;
T:累积占用CPU时间排序;
首部信息:
uptime信息:l命令(显示或关闭)
tasks及cpu信息:t命令(显示或关闭)
内存信息:m命令(显示或关闭)
多核CPU分别显示信息:1(数字1)(显示或关闭)
top - 16:47:16 up 152 days, 6:12, 3 users, load average: 0.01, 0.02, 0.05
Tasks: 170 total, 1 running, 169 sleeping, 0 stopped, 0 zombie
%Cpu0 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
us: 用户程序占据百分比
sy:内核百分比
ni:调整nice占据百分比
id:空闲百分比
wa:等待io完成的时间,一个程序运行需要IO操作时,需等待磁盘的数据载入到内核内存中再复制到进程内容中,这个过程需要等待。大量的IO等待时间,表示磁盘成为瓶颈。
hi:处理硬中断消耗
si:处理软中断消耗
st:虚拟机偷走的
%Cpu1 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu4 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu5 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu6 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu7 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 33.0/1872836 [||||||||||||||||||||||||||||||||| ]
KiB Swap: 0.0/0 [ ]
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
PR:优先级;VIRT:虚拟内存集 RES:常驻内存集 SHR:共享内容 S:状态
890 root 20 0 358756 29520 7052 S 0.0 1.6 0:42.73 firewalld
1187 root 20 0 574208 19468 6108 S 0.0 1.0 45:12.09 tuned
1194 root 20 0 1006380 18460 11308 S 0.0 1.0 0:00.45 libvirtd
855 polkitd 20 0 616304 15476 4976 S 0.0 0.8 1:56.65 polkitd
退出命令:q
修改刷新时间间隔:s
终止指定的进程:k
执行可选 选项:
-d #:指定刷新时间间隔,默认为3秒;
-b:以批次方式显示;
-n #:显示多少批次;
uptime命令:显示系统时间、运行时长及平均负载;
过去1分钟、5分钟和15分钟的平均负载(等待运行的进程队列的长度)
htop
htop命令:
执行可选选项:
-d #:指定延迟时间间隔;
-u UserName:仅显示指定用户的进程;
-s COLUME:以指定字段进行排序;
子命令:
l:显示选定的进程打开的文件列表;
s:跟踪选定的进程的系统调用;
t:以层级关系显示各进程状态;
a:将选定的进程绑定至某指定的CPU核心;
htop命令需要另外安装的,F1-F10多个菜单,可查找、过滤、排序、杀进程等,功能是top加强版 ,F1帮助里面有详细说明,F2可以设置显示方式,F4过滤后删除关键字需要按ctrl键。
F2进入后选择选项按空格可改变样式。
vmstat
vmstat命令:虚拟内存状态(古老而牛逼)
- Report virtual memory statistics
vmstat [options] [delay [count]]
procs:
r:等待运行的进程的个数;CPU上等待运行的任务的队列长度;
b:处于不可中断睡眠态的进程个数;被阻塞的任务队列的长度;
memory:
swpd:交换内存使用总量;
free:空闲的物理内存总量;
buffer:用于buffer的内存总量;
cache:用于cache的内存总量;
swap
si:数据进入swap中的数据速率(kb/s)
so:数据离开swap的速率(kb/s)
io
bi:从块设备读入数据到系统的速度(kb/s)
bo:保存数据至块设备的速率(kb/s)
system
in:interrupts,中断速率;
cs:context switch, 上下文 切换的速率(进程切换);
cpu
us: user space 用户空间使用占比
sy:system 系统调用时间占比
id:idle 空闲
wa:wait 等待
st: stolen 虚拟化偷走的
选项:
-s:显示内存统计数据;
dstat
dstat命令:(比vmstat更强大),查看系统主要资源状态的 ,需另外安装
- versatile tool for generating system resource statistics
dstat [-afv] [options..] [delay [count]]
常用选项:
-c, --cpu:显示cpu相关信息;
-C #,#,...,total
-d, --disk:显示磁盘的相关信息
-D sda,sdb,...,total
-g:显示page相关的速率数据;
-m:Memory的相关统计数据
-n:Interface的相关统计数据;
-p:显示process的相关统计数据;
-r:显示io请求的相关的统计数据;
-s:显示swapped的相关统计数据;
--tcp
--udp
--raw
--socket
--ipc
--top-cpu:显示最占用CPU的进程;
--top-io:最占用io的进程;
--top-mem:最占用内存的进程;
--top-latency:延迟最大的进程;
pmap
pmap命令:
- report memory map of a process
报告内存映射表
pmap [options] pid [...]
-x:显示详细格式的信息;
[root@wjsdb01 ~]# pmap 1
1: /sbin/init
00007fa908d24000 52K r-x-- /lib64/libnss_files-2.12.so (deleted)
00007fa908d31000 2044K ----- /lib64/libnss_files-2.12.so (deleted)
00007fa908f30000 4K r---- /lib64/libnss_files-2.12.so (deleted)
00007fa908f31000 4K rw--- /lib64/libnss_files-2.12.so (deleted)
00007fa908f32000 1576K r-x-- /lib64/libc-2.12.so (deleted)
从上面的结果显示libnss_files-2.12.so 文件被存放在内存中的多个不连续区域。
另一种查看方式:cat /proc/PID/maps
[root@iZuf6eufalzdvyatns3d5qZ proc]# cat /proc/1/maps
7f1267708000-7f1267715000 r-xp 00000000 fc:01 131104 /lib64/libnss_files-2.12.so
7f1267715000-7f1267914000 ---p 0000d000 fc:01 131104 /lib64/libnss_files-2.12.so
7f1267914000-7f1267915000 r--p 0000c000 fc:01 131104 /lib64/libnss_files-2.12.so
7f1267915000-7f1267916000 rw-p 0000d000 fc:01 131104 /lib64/libnss_files-2.12.so
glances
glances命令,很强大的工具,类似于windows的任务管理器,需另外安装
- A cross-platform curses-based monitoring tool
常用选项:
-b:以Byte为单位显示网上数据速率;
-d:打开/关闭磁盘I/O模块;
-m:打开/关闭mount模块;
-n:打开/关闭network模块;
-t #:刷新时间间隔;
-1:每个cpu的相关数据单独显示;
-o {HTML|CSV}:输出格式;
-f /PATH/TO/SOMEDIR:设定输出文件的位置;
回车键:可以搜索进程关键字
h:帮助,再按一次h返回原页面;
C/S模式下运行glances命令:
服务模式:
glances -s -B IPADDR
IPADDR:本机的某地址,用于监听;
客户端模式:
glances -c IPADDR
IPADDR:是远程服务器的地址;
kill
IPC: Inter Process Communication (进程间通信)
同一主机上:
signal (信号)(常见方式)
shm: shared memory (共享内存数据)
semerphor (小指示)
不同主机上:
rpc: remote procecure call (远程过程调用)(基于socket的高级的跨主机通信方式)
socket: (基于TCP通信,内核创建socket文件,记录端口和ip,程序通过这个socket文件读写数据,实现不同主机通信)
kill命令:
- terminate a process
用于向进程发送信号,以实现对进程的管理;
显示当前系统可用信号:
kill -l [signal]
每个信号的标识方法有三种:
1) 信号的数字标识;1,2,9
2) 信号的完整名称;SIGHUP,SIGTERM
3) 信号的简写名称;HUP,TERM
向进程发信号:
kill [-s signal|-SIGNAL] pid...
常用信号:
1) SIGHUP:无须关闭进程而让其重读配置文件;
2)SIGINT:终止正在运行的进程,相当于Ctrl+c
9)SIGKILL:杀死运行中的进程;(立即关闭)
15)SIGTERM:终止运行中的进程;(正常关闭)
18)SIGCONT:让处于停止态的进程进行允许,手动调度。
19)SIGSTOP:让进程处于停止态
[root@localhost ~]# kill -15 12135
[root@localhost ~]# ps aux |grep httpd
root 12130 0.1 0.2 224084 5052 ? Ss 10:33 0:00 /usr/sbin/httpd -DFOREGROUND
apache 12131 0.0 0.1 226168 3112 ? S 10:33 0:00 /usr/sbin/httpd -DFOREGROUND
apache 12132 0.0 0.1 226168 3108 ? S 10:33 0:00 /usr/sbin/httpd -DFOREGROUND
apache 12133 0.0 0.1 226168 3112 ? S 10:33 0:00 /usr/sbin/httpd -DFOREGROUND
apache 12134 0.0 0.1 226168 3112 ? S 10:33 0:00 /usr/sbin/httpd -DFOREGROUND
apache 12374 0.0 0.1 226168 3112 ? S 10:37 0:00 /usr/sbin/httpd -DFOREGROUND
root 12381 0.0 0.0 112712 960 pts/0 S+ 10:37 0:00 grep --color=auto httpd
[root@localhost ~]# kill -SIGTERM 12374
[root@localhost ~]# ps aux |grep httpd
root 12130 0.1 0.2 224084 5052 ? Ss 10:33 0:00 /usr/sbin/httpd -DFOREGROUND
apache 12131 0.0 0.1 226168 3112 ? S 10:33 0:00 /usr/sbin/httpd -DFOREGROUND
apache 12132 0.0 0.1 226168 3108 ? S 10:33 0:00 /usr/sbin/httpd -DFOREGROUND
apache 12133 0.0 0.1 226168 3112 ? S 10:33 0:00 /usr/sbin/httpd -DFOREGROUND
apache 12134 0.0 0.1 226168 3112 ? S 10:33 0:00 /usr/sbin/httpd -DFOREGROUND
apache 12401 0.0 0.1 226168 3112 ? S 10:38 0:00 /usr/sbin/httpd -DFOREGROUND
root 12404 0.0 0.0 112712 956 pts/0 S+ 10:38 0:00 grep --color=auto httpd
[root@localhost ~]# kill -TERM 12401
killall
killall命令:
终止“名称”之下的所有进程,
- kill processes by name
killall [-SIGNAL] program
[root@localhost ~]# killall -15 httpd
[root@localhost ~]# ps aux |grep httpd
root 13632 0.0 0.0 112712 960 pts/0 S+ 10:59 0:00 grep --color=auto httpd
有时候需要不关闭程序而重读配置文件,比如修改了目录文件路径,这时候需要用SIGHUP选项,但不是所有的修改都能这样(修改端口)
[root@localhost ~]# killall -1 httpd
[root@localhost ~]# killall -l
HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
UNUSED
[root@localhost ~]# killall -HUP httpd