Linux 进程管理

Posted llife

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 进程管理相关的知识,希望对你有一定的参考价值。

技术图片

Windows有任务管理器来管理进程,Linux也有相应的命令来管理进程。


查看进程

ps

  • 查看静态的进程统计信息

a:显示当前终端下的所有进程信息,包括其他用户的进程。与x选项结合时将显示系统中所有的进程信息。
u:使用以用户为主的格式输出进程信息。
x:显示当前用户在所有终端下的进程信息。
-e:显示系统内的所有进程信息。
-l:使用长(Long)格式显示进程信息。
-f:使用完整的(Full)格式显示进程信息。

[root@localhost ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.3 128164  6832 ?        Ss   15:50   0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root          2  0.0  0.0      0     0 ?        S    15:50   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    15:50   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S<   15:50   0:00 [kworker/0:0H]
root          6  0.0  0.0      0     0 ?        S    15:50   0:00 [kworker/u256:0]
root          7  0.0  0.0      0     0 ?        S    15:50   0:00 [migration/0]
//有很多,不写。

USER:启动该进程的用户账号的名称。
PID:该进程在系统中的数字ID号,在当前系统中是唯一的。
%CPUCPU占用的百分比。
%MEM:内存占用的百分比。
VSZ:占用虚拟内存(swap空间)的大小。
RSS:占用常驻内存(物理内存)的大小。
TTY:表明该进程在哪个终端上运行。?表示未知或不需要终端。
STAT:显示进程当前的状态,如S可中断休眠进程D不可中断休眠进程R运行Z僵死<高优先级N低优先级s父进程l多线性进程+前台进程。对处于僵死状态的进程应该予以手动终止。
START:启动该进程的时间。
TIME:该进程占用的CPU时间。
COMMAND:启动该进程的命令的名称。

[root@localhost ~]# ps -elf
F S UID         PID   PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root          1      0  0  80   0 - 32041 ep_pol 15:50 ?        00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
1 S root          2      0  0  80   0 -     0 kthrea 15:50 ?        00:00:00 [kthreadd]
1 S root          3      2  0  80   0 -     0 smpboo 15:50 ?        00:00:00 [ksoftirqd/0]
1 S root          5      2  0  60 -20 -     0 worker 15:50 ?        00:00:00 [kworker/0:0H]
1 S root          6      2  0  80   0 -     0 worker 15:50 ?        00:00:00 [kworker/u256:0]
1 S root          7      2  0 -40   - -     0 smpboo 15:50 ?        00:00:00 [migration/0]
//有很多,不写。

PPID:当前进程的父进程
CCPU占用
PRI:用户态的进程优先级
NI:内核态的进程优先级,取值范围-20~19,数值越低,优先级越高。
ADDR-表示正在运行
SZ:虚拟内存swap占用
WCHAN:当前进程在内核中的名称

top

  • 查看进程动态信息,每3s刷新一次
[root@localhost ~]# top
top - 19:27:16 up  3:36,  1 user,  load average: 0.00, 0.01, 0.05
Tasks:  98 total,   1 running,  97 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  6.2 sy,  0.0 ni, 93.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1867024 total,  1348360 free,   148256 used,   370408 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1525688 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
     1 root      20   0  128164   6832   4064 S  0.0  0.4   0:02.43 systemd
     2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd
     3 root      20   0       0      0      0 S  0.0  0.0   0:00.25 ksoftirqd/0
     5 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.59 kworker/u256:0
     7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0
//有很多,不写。

Tasks系统任务信息:total总进程数,running正在运行的进程数,sleeping休眠的进程数,stopped中止的进程数,zombie僵死无响应的进程数。

CPU占用信息:us用户占用,sy内核占用,ni优先级调度占用,id空闲CPU,waI/O等待占用,hi硬件中断占用,si软件中断占用,st虚拟化占用。

Mem内存占用信息:total总内存空间,free空闲内存,used已用内存,buff/cache,物理内存和交换内存的缓冲区总和。

Swap交换空间占用:total总交换空间,free空闲交换空间,used已用交换空间,avail Mem可用物理空间。

pgrep

  • 过滤查询进程信息

-l:同时输出对应的进程名,否则只输出PID,不便于查看。
-U:查询特定用户的进程
-t:查询特定终端运行的进程

[root@localhost ~]# pgrep -l "login"
39654 systemd-logind
[root@localhost ~]# pgrep -l -U root -t tty1
40422 X

pstree

  • 查看进程树

-a:列出完整的命令信息
-u:列出对应的用户名
-p:列出对应的PID

[root@localhost ~]# pstree -aup
systemd,1 --switched-root --system --deserialize 21
  ├─ModemManager,39616
  │   ├─ModemManager,39631
  │   └─ModemManager,39649
  ├─NetworkManager,39701 --no-daemon
  │   ├─dhclient,39841 -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-ens33.pid -lf...
  │   ├─NetworkManager,39704
  │   └─NetworkManager,39709
//有很多,不写。
  • 不加u,以指定用户作为参数,可查看属于指定用户的进程数结构。
[root@localhost ~]# pstree -ap ll
未发现进程。

控制进程

&

  • 运行较长时间的操作时,命令后面加&符号,放到后台运行
[root@localhost ~]# dd if=/dev/zero of=~/test.tmp bs=1M count=2048 &
[1] 8773

Ctrl + C

  • 终止正在执行的进程
[root@localhost ~]# ping www.baidu.com
PING www.a.shifen.com (183.232.231.174) 56(84) bytes of data.
64 bytes from 183.232.231.174 (183.232.231.174): icmp_seq=1 ttl=128 time=34.6 ms
64 bytes from 183.232.231.174 (183.232.231.174): icmp_seq=2 ttl=128 time=34.9 ms
^C
--- www.a.shifen.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 34.660/34.823/34.987/0.248 ms

Ctrl + Z

  • 将前台正在执行的进程调入后台并暂停执行
[root@localhost ~]# dd if=/dev/zero of=~/data.tmp bs=1M count=2048
^Z
[1]+  Stopped                 dd if=/dev/zero of=~/data.tmp bs=1M count=2048

jobs

  • 查看当前终端在后台运行的进程任务

-l:显示进程对应的PID

[root@localhost ~]# jobs -l
[1]+  8778 Stopped                 dd if=/dev/zero of=~/data.tmp bs=1M count=2048

bg

  • 将后台中暂停执行的任务恢复运行,并继续在后台运行,需指定任务编号作为参数
[root@localhost ~]# bg 1

fg

  • 将后台中的任务恢复到前台运行,需指定任务编号作为参数
[root@localhost ~]# fg 1

kill

  • 通过PID终止进程运行,无特定选项时,给程序发送终止信号并正常退出运行

-9:强制终止

[root@localhost ~]# vi testfile

[1]+  Stopped                 vi testfile
[root@localhost ~]# jobs -l
[1]+  8935 Stopped                 vi testfile
[root@localhost ~]# kill 8935
[root@localhost ~]# jobs -l
[1]+  8935 Stopped                 vi testfile
[root@localhost ~]# kill -9 8935
[root@localhost ~]# jobs -l
[1]+  8935 Killed                  vi testfile

killall

  • 通过进程名终止运行,需要结束多个相同名称的进程时,killall更方便。
[root@localhost ~]# vi testfile1

[1]+  已停止               vi testfile1
[root@localhost ~]# vi testfile2

[2]+  已停止               vi testfile2
[root@localhost ~]# jobs -l
[1]-  1803 停止                  vi testfile1
[2]+  1804 停止                  vi testfile2
[root@localhost ~]# killall -9 vi
[1]-  已杀死               vi testfile1
[2]+  已杀死               vi testfile2
[root@localhost ~]# jobs -l

pkill

  • 特定条件终止,与pgrep类似

-U:指定用户
-t:指定终端

[root@localhost ~]# pgrep -l -U "ll"
1875 gnome-keyring-d
1893 gnome-session-b
//有很多,不写
[root@localhost ~]# pkill -9 -U "ll"
[root@localhost ~]# pgrep -l -U "ll"

以上是关于Linux 进程管理的主要内容,如果未能解决你的问题,请参考以下文章

Linux 内核Linux 内核体系架构 ( 进程调度 | 内存管理 | 中断管理 | 设备管理 | 文件系统 )

Linux性能及调优指南(翻译)之Linux进程管理

linux进程管理

Linux进程管理专题

linux进程管理

Linux 进程管理 进程优先级管理