Linux系统日常进程管理与监控
1.进程是什么
进程是正在执行的一个程序或命令,每一个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源。
在LINUX系统中进程ID用PID
表示,范围从0-32768
,其中PID=1
的进程为init
初始化进程。
2.进程的分类
进程可分为系统进程和用户进程。
1)系统进程:
可以执行内存资源分配和进程切换等管理工作;而且,该进程的运行不受用户的干预,即使是root
用户也不能干预系统进程的运行。
2)用户进程:
通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行或关闭。
用户进程分类3类:
- 交互进程:由一个shell终端启动的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行在后台。
- 批处理进程:该进程是一个进程集合,负责按顺序启动其他的进程。
- 守护进程:守护进程是一直运行的一种进程,经常在
linux
系统启动时启动,在系统关闭时终止。例如httpd
进程,一直处于运行状态,等待用户的访问。还有经常用的crond
进程,这个进程类似与windows
的计划任务,可以周期性的执行用户设定的某些任务。
3.进程的查看
3.1使用ps
命令查看进程(瞬间)
1)查看系统中所有进程,使用BSD操作系统格式
1 2 3 4 5 6 7 8 9 10 | [root@mysrs ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 193940 7048 ? Ss 1月13 1:22 /usr/lib/systemd/systemd --switched-root --system --deserialize 22 root 2 0.0 0.0 0 0 ? S 1月13 0:00 [kthreadd] root 4 0.0 0.0 0 0 ? S< 1月13 0:00 [kworker/0:0H] root 6 0.0 0.0 0 0 ? S 1月13 0:00 [ksoftirqd/0] root 7 0.0 0.0 0 0 ? S 1月13 0:01 [migration/0] root 8 0.0 0.0 0 0 ? S 1月13 0:00 [rcu_bh] root 9 0.0 0.0 0 0 ? S 1月13 1:39 [rcu_sched] …… |
2)查看系统中所有进程,使用LINUX标准命令格式
1 2 3 4 5 6 7 8 9 10 11 12 | [root@mysrs ~]# ps -le F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1 0 0 80 0 - 48485 ep_pol ? 00:01:22 systemd 1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:00 kthreadd 1 S 0 4 2 0 60 -20 - 0 worker ? 00:00:00 kworker/0:0H 1 S 0 6 2 0 80 0 - 0 smpboo ? 00:00:00 ksoftirqd/0 1 S 0 7 2 0 -40 - - 0 smpboo ? 00:00:01 migration/0 1 S 0 8 2 0 80 0 - 0 rcu_gp ? 00:00:00 rcu_bh 1 S 0 9 2 0 80 0 - 0 rcu_gp ? 00:01:39 rcu_sched 1 S 0 10 2 0 60 -20 - 0 rescue ? 00:00:00 lru-add-drain 5 S 0 11 2 0 -40 - - 0 smpboo ? 00:00:12 watchdog/0 …… |
3)查看系统中所有进程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [root@mysrs ~]# ps -A PID TTY TIME CMD 1 ? 00:01:22 systemd 2 ? 00:00:00 kthreadd 4 ? 00:00:00 kworker/0:0H 6 ? 00:00:00 ksoftirqd/0 7 ? 00:00:01 migration/0 8 ? 00:00:00 rcu_bh 9 ? 00:01:39 rcu_sched 10 ? 00:00:00 lru-add-drain 11 ? 00:00:12 watchdog/0 12 ? 00:00:09 watchdog/1 13 ? 00:00:00 migration/1 14 ? 00:00:00 ksoftirqd/1 16 ? 00:00:00 kworker/1:0H …… |
4)详细显示每个进程信息
1 2 3 4 5 | [root@mysrs ~]# ps -f UID PID PPID C STIME TTY TIME CMD root 5117 5101 0 19:04 pts/0 00:00:00 -bash root 5478 5117 0 19:35 pts/0 00:00:00 ps -f [root@mysrs ~]# |
5)ps
选项的解释
a:显示一个终端的所有进程,除了会话引线 u:显示进程的归属用户及内存的使用情况 x:显示没有控制终端的进程 -l:长格式显示。显示更加详细的信息 -e:显示所有进程,和-A作用一致
-f:详细显示每个进程信息,经常和
e
组合使用,如ps -ef
6)ps
命令输出各字段的含义
1 2 | [root@mysrs ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND |
上面字段含义如下:
USER:该进程是由哪个用户产生的;PID:进程的
ID
号;%CPU:该进程占用CPU
资源的百分比,占用越高,进程越耗费资源;%MEM:该进程占用物理内存的百分比,占用越高,进程越耗费资源;VSZ:该进程占用虚拟内存的大小,单位KB
;RSS:该进程占用实际物理内存的大小,单位KB
;TTY:该进程是在哪个终端中运行的。其中tty1-tty7
代表本地控制台终端,tty1-tty6
是本地的字符界面终端,tty7
是图形终端。pts/0-255
代表虚拟终端。STAT:进程状态。常见的状态有:R:运行
,S:睡眠
,T:停止
,s:包含子进程
,+:位于后台
START:该进程的启动时间;TIME:该进程占用CPU
的运算时间,它不是系统时间;COMMAND:产生此进程的命令名。
3.2使用pstree
命令查看进程树
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [root@mysrs ~]# pstree systemd─┬─ModemManager───2*[{ModemManager}] ├─NetworkManager───2*[{NetworkManager}] ├─2*[abrt-watch-log] ├─abrtd ├─accounts-daemon───2*[{accounts-daemon}] ├─alsactl ├─at-spi-bus-laun─┬─dbus-daemon───{dbus-daemon} │ └─3*[{at-spi-bus-laun}] ├─at-spi2-registr───2*[{at-spi2-registr}] ├─atd ├─auditd─┬─audispd─┬─sedispatch │ │ └─{audispd} │ └─{auditd} ├─avahi-daemon───avahi-daemon …… |
它有两个选项:
-p:显示进程的
PID
-u:显示进程的所属用户
如下,加了参数后输出形式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [root@mysrs ~]# pstree -pu systemd(1)─┬─ModemManager(754)─┬─{ModemManager}(770) │ └─{ModemManager}(775) ├─NetworkManager(873)─┬─{NetworkManager}(882) │ └─{NetworkManager}(885) ├─abrt-watch-log(740) ├─abrt-watch-log(741) ├─abrtd(738) ├─accounts-daemon(787)─┬─{accounts-daemon}(797) │ └─{accounts-daemon}(804) ├─alsactl(743) ├─at-spi-bus-laun(1855,gdm)─┬─dbus-daemon(1860)───{dbus-daemon}(1861) │ ├─{at-spi-bus-laun}(1856) │ ├─{at-spi-bus-laun}(1857) │ └─{at-spi-bus-laun}(1859) ├─at-spi2-registr(1863,gdm)─┬─{at-spi2-registr}(1865) │ └─{at-spi2-registr}(1866) ├─atd(1199) …… |
3.3使用top命令查看系统的健康状态(实时)
top
命令显示的是实时的系统信息,其常用选项如下:
-d 秒数:指定
top命令
每隔几秒更新,默认是3秒
。-b:使用批处理模式输出,一般和“-n”
选项合用。-n 次数:指定top
命令执行的次数,一般和“-b”
选项合用。
在top命令
的交互式模式当中可以执行的命令:
?或h:显示交互模式的帮助P:以
CPU
使用率排序,默认就是此项M:以内存的使用率排序N:以PID
排序q:退出top
top命令
使用及含义解释:
1 2 3 4 5 6 7 8 9 10 11 12 13 | [root@mysrs ~]# top top - 20:02:15 up 17 days, 8:45, 1 user, load average: 0.00, 0.01, 0.05 Tasks: 188 total, 2 running, 186 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 7.1 sy, 0.0 ni, 92.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 3879984 total, 2980560 free, 459996 used, 439428 buff/cache KiB Swap: 8257532 total, 8257532 free, 0 used. 3154196 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 5765 root 20 0 162128 2260 1536 R 5.0 0.1 0:00.07 top 1 root 20 0 193940 7048 4208 S 0.0 0.2 1:22.40 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.42 kthreadd 4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 6 root 20 0 0 0 0 S 0.0 0.0 0:00.21 ksoftirqd/0 …… |
1)top
命令输出第一行的含义:
内容 | 说明 |
---|---|
20:02:15 | 系统当前时间 |
up 17 days, 8:45 | 系统运行时间,本机已运行17天8小时45分钟 |
1 user | 当前登录了一个用户 |
load average: 0.00, 0.01, 0.05 | 系统在之前1分钟、5分钟、15分钟的平均负载。 这个值和CPU核数有关,大于CPU核数,说明系统已超出负载。 |
2)top命令输出第二行的含义:
Tasks: 188 total, 2 running, 186 sleeping, 0 stopped, 0 zombie
表示当前总进程为188个
,其中2个
在运行,186个
进程处理睡眠状态。
3)top命令输出第三行的含义:
内容 | 说明 |
---|---|
%Cpu(s): 0.0 us | 用户模式占的CPU百分比 |
7.1 sy | 系统模式占的CPU百分比 |
0.0 ni | 改变过优先级的用户进程占用的CPU百分比 |
92.9 id | 空闲CPU的CPU百分比,目前表示很空闲 |
0.0 wa | CPU等待硬盘写入时间,判断硬盘I/O |
0.0 hi | CPU处理硬中断占用的百分比 |
0.0 si | CPU处理软中断占用的百分比 |
0.0 st | 虚拟时间百分比 |
3.4使用lsof
命令查看进程打开了哪些文件
lsof
命令常用参数如下:
-p pid : 输出指定进程打开的文件;
-l : 输出中使用
ID
代替用户名;-u userName : 输出指定用户打开的文件;
-c string : 输出
COMMAND
列中包含string
的项;-d fd : 输出包含指定描述符的项;
fileName : 输出打开文件
fileName
的所有项;
1)不加任何参数输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [root@mysrs ~]# lsof | more COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd DIR 253,0 246 64 / systemd 1 root rtd DIR 253,0 246 64 / systemd 1 root txt REG 253,0 1628608 67646570 /usr/lib/systemd/systemd systemd 1 root mem REG 253,0 20064 33665971 /usr/lib64/libuuid.so.1.3.0 systemd 1 root mem REG 253,0 265576 34120301 /usr/lib64/libblkid.so.1.1.0 systemd 1 root mem REG 253,0 90248 33665967 /usr/lib64/libz.so.1.2.7 systemd 1 root mem REG 253,0 157424 33673545 /usr/lib64/liblzma.so.5.2.2 systemd 1 root mem REG 253,0 23968 33673538 /usr/lib64/libcap-ng.so.0.0.0 systemd 1 root mem REG 253,0 19896 33693897 /usr/lib64/libattr.so.1.1.0 systemd 1 root mem REG 253,0 19248 33665533 /usr/lib64/libdl-2.17.so systemd 1 root mem REG 253,0 402384 33665953 /usr/lib64/libpcre.so.1.2.0 systemd 1 root mem REG 253,0 2156592 35882801 /usr/lib64/libc-2.17.so systemd 1 root mem REG 253,0 142144 33665880 /usr/lib64/libpthread-2.17.so …… |
上面各字段的含义如下表:
字段名称 | 功能含义 |
---|---|
COMMAND | 命令名称 |
PID | 进程ID |
TID | 线程ID,如果为空代表列出的是进程 |
USER | 用户ID号或登录名 |
FD | 文件描述符 |
TYPE | 与文件关联结点的类型 |
DEVICE | 设备号 |
SIZE/OFF | 文件大小/偏移量,以字节为单位 |
NODE | 文件结点 |
NAME | 文件挂载点和文件所在的系统 |
2)列出1号进程打开的文件
1 2 3 4 5 6 7 8 9 10 11 | [root@mysrs ~]# lsof -p 1 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd DIR 253,0 246 64 / systemd 1 root rtd DIR 253,0 246 64 / systemd 1 root txt REG 253,0 1628608 67646570 /usr/lib/systemd/systemd systemd 1 root mem REG 253,0 20064 33665971 /usr/lib64/libuuid.so.1.3.0 systemd 1 root mem REG 253,0 265576 34120301 /usr/lib64/libblkid.so.1.1.0 systemd 1 root mem REG 253,0 90248 33665967 /usr/lib64/libz.so.1.2.7 systemd 1 root mem REG 253,0 157424 33673545 /usr/lib64/liblzma.so.5.2.2 systemd 1 root mem REG 253,0 23968 33673538 /usr/lib64/libcap-ng.so.0.0.0 …… |
3)lsof常用组合
- 显示进程打开的文件数
1 2 3 4 5 6 7 8 | [root@mysrs ~]# lsof -c sshd COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1183 root cwd DIR 253,0 246 64 / sshd 1183 root rtd DIR 253,0 246 64 / sshd 1183 root txt REG 253,0 852856 35937005 /usr/sbin/sshd sshd 1183 root mem REG 253,0 61560 33665870 /usr/lib64/libnss_files-2.17.so sshd 1183 root mem REG 253,0 68192 33673554 /usr/lib64/libbz2.so.1.0.6 …… |
- 统计
sshd
进程打开的文件数
1 2 3 | [root@mysrs ~]# lsof -c sshd | wc -l 146 [root@mysrs ~]# |
- 查看
80端口
和22端口
对应的用户进程
1 2 3 4 5 6 7 8 9 10 11 12 | [root@mysrs ~]# lsof -i :80 [root@mysrs ~]# lsof -i :22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1183 root 3u IPv4 21489 0t0 TCP *:ssh (LISTEN) sshd 1183 root 4u IPv6 21491 0t0 TCP *:ssh (LISTEN) sshd 5101 root 3u IPv4 1222049 0t0 TCP mysrs:ssh->123.183.158.11:ddns-v3 (ESTABLISHED) [root@mysrs ~]# lsof -i tcp:22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1183 root 3u IPv4 21489 0t0 TCP *:ssh (LISTEN) sshd 1183 root 4u IPv6 21491 0t0 TCP *:ssh (LISTEN) sshd 5101 root 3u IPv4 1222049 0t0 TCP mysrs:ssh->123.183.158.11:ddns-v3 (ESTABLISHED) [root@mysrs ~]# |
3.5使用pgrep
命令查看进程PID
信息
这个命令只输出进程PID
号,如下:
1 2 3 4 | [root@mysrs ~]# pgrep -f sshd 1183 5101 [root@mysrs ~]# |
可以用前面的ps命令
进行验证一下:
1 2 3 | [root@mysrs ~]# ps -ef | grep sshd root 1183 1 0 1月13 ? 00:00:00 /usr/sbin/sshd -D root 5101 1183 0 19:04 ? 00:00:00 sshd: root@pts/0 |
可以看出两个命令的结果是一致的。
4.进程的终止
进程的终端通常用kill和killall
命令。这里有一个信号类型的概念,可以用kill -l
命令查看: