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操作系统格式
[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标准命令格式
[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)查看系统中所有进程
[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)详细显示每个进程信息
[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命令输出各字段的含义
[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命令查看进程树
[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:显示进程的所属用户
如下,加了参数后输出形式:
[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命令使用及含义解释:
[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)不加任何参数输出:
[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号进程打开的文件
[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常用组合
显示进程打开的文件数
[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进程打开的文件数
[root@mysrs ~]# lsof -c sshd | wc -l
146
[root@mysrs ~]#
查看80端口和22端口对应的用户进程
[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号,如下:
[root@mysrs ~]# pgrep -f sshd
1183
5101
[root@mysrs ~]#
可以用前面的ps命令进行验证一下:
[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命令查看:
[root@mysrs ~]# kill -l
- SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
- SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
- SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
- SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
- SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
- SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
- SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
- SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
- SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
- SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
- SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
- SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
- SIGRTMAX-1 64) SIGRTMAX
从上面可以看出一共有64个信号类型,其中 :9) SIGKILL、2) SIGINT、15) SIGTERM分别对应数字9、2、15。
4.1 kill命令
它的命令格式为:
kill [信号类型] 进程PID
kill -9 进程PID:表示强制结束进程
kill -2 进程PID:表示结束进程,但是并不是强制性的
kill -15 进程PID:表示正常结束进程,默认类型就是15。
下面以我们安装的nginx服务为例,进行终止:
先用ps -ef | grep nginx或者pgrep -f nginx查看进程端口:
[root@mysrs ~]# ps -ef | grep nginx
root 6563 1 0 21:09 ? 00:00:00 nginx: master process /usr/sbin/nginx
nginx 6564 6563 0 21:09 ? 00:00:00 nginx: worker process
nginx 6565 6563 0 21:09 ? 00:00:00 nginx: worker process
nginx 6566 6563 0 21:09 ? 00:00:00 nginx: worker process
nginx 6567 6563 0 21:09 ? 00:00:00 nginx: worker process
root 6587 5117 0 21:10 pts/0 00:00:00 grep --color=auto nginx
[root@mysrs ~]# pgrep -f nginx
6563
6564
6565
6566
6567
[root@mysrs ~]#
然后再用kill命令终止:
[root@mysrs ~]# kill -9 6563
终止后验证检查是否生效:
[root@mysrs ~]# pgrep -f nginx
6564
6565
6566
6567
[root@mysrs ~]#
4.2 killall命令
killall也是关闭进程的一个命令,与kill不同的是,killall后面跟的是进程的名字,而不是进程的PID,因而,killall可以终止一组进程。
killall [信号类型] 进程名称
如上面:
[root@mysrs ~]# killall -9 nginx
[root@mysrs ~]# ps -ef | grep nginx
root 6669 5117 0 21:16 pts/0 00:00:00 grep --color=auto nginx
[root@mysrs ~]#
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析