Linux之进程管理

本文详细解读了进程管理中的基本概念,包括进程ID的独特性、父子进程的交互与管理,以及守护进程、交互进程和批处理进程的区别。此外,还介绍了ps、pstree和kill命令在进程监控和终止中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

进程管理

简单来说进程就是系统中正在运行的程序或命令,每一个进程都有一个对应的实体,都占有一定的资源,而且一个运行着的程序可能有多个进程。进程有以下特点

  • 每一个进程都有一个 ID 号(唯一的)。

  • 每一个进程,都会对应一个父进程,而这个父进程可以复制多个子进程。

  • 每个进程都可能以两种方式存在的。前台与后台,

    • 前台进程就是用户目前的屏幕上可以进行操作的
    • 后台进程则是实际在操作,但由于屏幕上无法看到的进程,通常使用后台方式执行。
  • 一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中。直到关机才才结束。

1、进程关系

​ 进程关系主要是指子进程和父进程之间的关系,在Linux系统每一个子进程都有对应的父进程,每一个父进程都有对应的子进程,他们的关系是管理和被管理的关系,当父进程终止时,子进程也随之而终止,但子进程终止时父进程并不一定终止。比如httpd服务器运行时,我们可以杀掉其子进程,父进程并不会因为子进程的终止而终止。

​ 在进程管理中,子进程和父进程之间的关系不是一对一的关系,即一个子进程只有唯一的父进程,但是一个父进程却可以有多个子进程,而且当我们发现占用资源过多,或无法控制的进程时,应该杀死它,以保护系统的稳定安全运行 。

2、进程分类

进程一般分为三大类,即守护进程(有时候也叫上帝进程)、交互进程、批处理进程

  1. 交互进程:是由shell启动的进程,它既可以在前台运行,也可以在后台运行。交互进程在执行过程中,要求与用户进行交互操作。简单来说就是用户需要给出某些参数或者信息,进程才能继续执行。
  2. 批处理进程:与windows原来的批处理很类似,是一个进程序列。该进程负责按照顺序启动其它进程。
  3. 守护进程:是是执行特定功能或者执行系统相关任务的后台进程。守护进程只是一个特殊的进程,不是内核的组成部分。许多守护进程在系统启动时启动,直到系统关闭时才停止运行。而某些守护进程只是在需要时才会启动,比如FTP或者Apache服务等,可以在需要的时候才启动该服务。

守护进程总是活跃的,一般是后台运行,守护进程一般是由系统在开机时通过脚本自动激活启动或超级管理用户root来启动。

另外,根据进程状态的不同,又可以把进程分为另外三类:守护进程、孤儿进程和僵尸进程。

  1. 守护进程:(补充):所有守护进程都可以超级用户(用户ID为0)的优先权运行;守护进程没有控制终端;守护进程的父进程都是init进程(即1号进程)。
  2. 孤儿进程:一个父进程退出后,它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被init进程所收养,并由init进程对它们完成状态收集工作。
  3. 僵尸进程:一个子进程结束但是没有完全释放内存(在内核中的 task_struct没有释放),该进程就成为僵尸进程。

当僵尸进程的父进程结束后该僵尸进程就会被init进程所收养,最终被回收。

僵尸进程会导致资源的浪费,而孤儿进程不会。

3、进程命令

3.1 ps:显示当前进程的状态

ps(英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器。它所提供的查看结果并不动态连续的,而是一次性的查看(只能查看当前的),如果想对进程时间监控应该用top工具。
语法

ps [参数] 

参数

  • -a 显示当前所有用户的所有进程的信息

  • -u 以用户的格式显示信息

  • -x 显示后台运行进程的参数

  • -r 显示运行中的进行

  • -j 以任务格式显示信息

  • -f 以树的格式显示信息

  • -l 长格式输出

  • -au 显示较详细的信息

  • -aux 显示所有包含其他使用者的进程信息

  • au(x) 输出格式 :

    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    
    • USER: 行程拥有者
    • PID: pid
    • %CPU: 占用的 CPU 使用率
    • %MEM: 占用的记忆体使用率
    • VSZ: 占用的虚拟内存大小
    • RSS: 进程占用的物理内存值
    • TTY: 该进程建立时所对应的终端
    • STAT: 该进程的运行状态:
      • D: 无法中断的休眠状态 (通常 IO 的进程)
      • R: 正在执行中
      • S: 静止状态
      • T: 暂停执行
      • Z: 不存在但暂时无法消除
      • W: 没有足够的内存分页可分配
      • <: 高优先序的行程
      • N: 低优先序的行程
      • L: 有内存分页分配并锁在内存体内(实时系统或I/O)
    • START: 行程开始时间
    • TIME: 执行的时间
    • COMMAND:所执行的指令

案例

显示所有进程信息

[root@root /]# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  51748  3980 ?        Ss   Jul04   7:37 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root         2  0.0  0.0      0     0 ?        S    Jul04   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        S<   Jul04   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S    Jul04   0:05 [ksoftirqd/0]
root         7  0.0  0.0      0     0 ?        S    Jul04   0:09 [migration/0]
root         8  0.0  0.0      0     0 ?        S    Jul04   0:00 [rcu_bh]
..............................................................

其中

  • USER表示启动进程用户
  • PID表示进程标志号
  • %CPU表示运行该进程占用CPU的时间与该进程总的运行时间的比例。
  • %MEM表示该进程占用内存和总内存的比例。
  • VSZ表示占用的虚拟内存大小,以KB为单位。
  • RSS为进程占用的物理内存值,以KB为单位。
  • TTY表示该进程建立时所对应的终端,"?"表示该进程不占用终端。
  • STAT表示进程的运行状态
    • D:不可中断的睡眠
    • R:就绪(在可运行队列中)
    • S:睡眠
    • T:被跟踪或停止
    • Z:终止(僵死)的进程,Z不存在,但暂时无法消除
    • W:没有足够的内存分页可分配
    • <:高优先序的进程
    • N:低优先序的进程
    • L:有内存分页分配并锁在内存体内(实时系统或I/O)。
  • START为进程开始时间。
  • TIME为执行的时间。
  • COMMAND是对应的命令名

通常ps指令和管道符(|)连着一起使用,用于查找指定进程格式:

ps -ef 可以查看父进程的信息
ps -ef | grep 进程关键字

但是一般情况下不会使用ps -ef查看父进程信息,一般使用树形结构。

案例

找出含有mysql的进程

[root@root /]# ps -aux |grep mysql
root      1219  0.0  0.0 115544  1712 ?        S    Jul04   0:00 /bin/sh /www/server/mysql/bin/mysqld_safe --datadir=/www/server/data --pid-file=/www/server/data/root.pid
mysql     1899  0.0  5.3 1242276 205724 ?      Sl   Jul04  25:51 /www/server/mysql/bin/mysqld --basedir=/www/server/mysql --datadir=/www/server/data --plugin-dir=/www/server/mysql/lib/plugin --user=mysql --log-error=root.err --open-files-limit=65535 --pid-file=/www/server/data/root.pid --socket=/tmp/mysql.sock --port=3306
root      6601  0.0  0.0 112812   976 pts/0    S+   02:26   0:00 grep --color=auto mysql

2.找出消耗内存最多的前10名进程

[root@root /]#  ps -auxf | sort -nr -k 4 | head -10 
mysql     1899  0.0  5.3 1242276 205724 ?      Sl   Jul04  25:51  \_ /www/server/mysql/bin/mysqld --basedir=/www/server/mysql --datadir=/www/server/data --plugin-dir=/www/server/mysql/lib/plugin --user=mysql --log-error=root.err --open-files-limit=65535 --pid-file=/www/server/data/root.pid --socket=/tmp/mysql.sock --port=3306
root     29763  0.1  3.0 3504832 119912 ?      Sl   Jul04  53:36 /usr/java/jdk1.8.0_221-amd64/jre/bin/java -Djava.util.logging.config.file=/home/itbestboy/apache-tomcat-9.0.48/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/itbestboy/apache-tomcat-9.0.48/bin/bootstrap.jar:/home/itbestboy/apache-tomcat-9.0.48/bin/tomcat-juli.jar -Dcatalina.base=/home/itbestboy/apache-tomcat-9.0.48 -Dcatalina.home=/home/itbestboy/apache-tomcat-9.0.48 -Djava.io.tmpdir=/home/itbestboy/apache-tomcat-9.0.48/temp org.apache.catalina.startup.Bootstrap start
root      2806  0.0  2.4 667792 95172 ?        Ssl  Jul07   7:33 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root       929  0.0  1.2 577244 47080 ?        Ssl  Jul07   6:21 /usr/bin/containerd
root       706  0.0  0.8 362676 33512 ?        Ssl  Jul04   0:06 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
root      2029  0.0  0.8 370660 33816 ?        Sl   Jul04   0:10 /www/server/panel/pyenv/bin/python /www/server/panel/BT-Panel
root      7026  1.4  0.4 133560 17292 ?        S<sl Jul16 505:44 /usr/local/aegis/aegis_client/aegis_11_01/AliYunDun
root      1071  0.0  0.4 574304 17412 ?        Ssl  Jul04   5:39 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
root       428  0.0  0.3  47280 12748 ?        Ss   Jul04   0:13 /usr/lib/systemd/systemd-journald
root      1941  0.0  0.3 880256 13176 ?        Sl   Jul04  46:32 /www/server/panel/pyenv/bin/python /www/server/panel/BT-Task

3.2 pstree:列出当前的进程,以及它们的树状结构

pstree命令将所有行程以树状图显示,树状图将会以 pid (如果有指定) 或是以 init 这个基本行程为根 (root),如果有指定使用者 id,则树状图会只显示该使用者所拥有的行程。

使用权限:所有使用者。

语法

pstree [参数] [pid|user]

pstree -V

参数

  • -a 显示执行程序的命令与完整参数
  • -c 取消同名程序,合并显示
  • -p 显示进程PID
  • -u 显示用户组,即UID信息
  • -l:长格式显示
  • -h:对输出结果进行处理,高亮显示正在执行的程序。

案例

以树状图显示进程的pid

[root@root /]# pstree -cp
systemd(1)─┬─AliSecGuard(2323)─┬─{AliSecGuard}(2324)
           │                   ├─{AliSecGuard}(2325)
           │                   ├─{AliSecGuard}(2328)
           │                   ├─{AliSecGuard}(2330)
           │                   ├─{AliSecGuard}(2331)
           │                   └─{AliSecGuard}(7059)
           ├─AliYunDun(7026)─┬─{AliYunDun}(7027)
           │                 ├─{AliYunDun}(7028)
           │                 ├─{AliYunDun}(7029)
           │                 ├─{AliYunDun}(7030)
           │                 ├─{AliYunDun}(7031)
           │                 ├─{AliYunDun}(7032)
           │                 ├─{AliYunDun}(7033)
           │                 ├─{AliYunDun}(7034)
           │                 ├─{AliYunDun}(7035)
           │                 ├─{AliYunDun}(7036)
           │                 ├─{AliYunDun}(7037)
           │                 ├─{AliYunDun}(7038)
           │                 ├─{AliYunDun}(7039)
           │                 ├─{AliYunDun}(7040)
           │                 ├─{AliYunDun}(7041)
           │                 ├─{AliYunDun}(7042)
           │                 ├─{AliYunDun}(7043)
           │                 ├─{AliYunDun}(7044)
           │                 ├─{AliYunDun}(7045)
           │                 ├─{AliYunDun}(7046)
           │                 ├─{AliYunDun}(7047)
           │                 ├─{AliYunDun}(7048)
           │                 ├─{AliYunDun}(7049)
           │                 └─{AliYunDun}(7050)
           ├─AliYunDunUpdate(6957)─┬─{AliYunDunUpdate}(6959)
           │                       ├─{AliYunDunUpdate}(6960)
           │                       ├─{AliYunDunUpdate}(6967)
           │                       ├─{AliYunDunUpdate}(6968)
           │                       └─{AliYunDunUpdate}(7068)
           ├─BT-Panel(2029)───{BT-Panel}(2030)
           ├─BT-Task(1941)─┬─python(6954)
           │               ├─{BT-Task}(1942)
           │               ├─{BT-Task}(1943)
           │               ├─{BT-Task}(1944)
           │               ├─{BT-Task}(1945)
           │               ├─{BT-Task}(1946)
           │               ├─{BT-Task}(1947)
           │               ├─{BT-Task}(1948)
           │               ├─{BT-Task}(1949)
           │               └─{BT-Task}(1950)
           ├─agetty(1180)
           ├─agetty(1181)
           ├─aliyun-service(15948)─┬─{aliyun-service}(15949)
           │                       ├─{aliyun-service}(15950)
           │                       ├─{aliyun-service}(15951)
           │                       ├─{aliyun-service}(15956)
           │                       ├─{aliyun-service}(15957)
           │                       ├─{aliyun-service}(15958)
           │                       └─{aliyun-service}(16336)
           ├─assist_daemon(16061)─┬─{
           │                       
           │                      
           │                      
           │                       
           │                     
           │        

3.3 结束(终止)进程

若是某个进程执行一半需要停止时,或是已消了很大的系统资源时,此时可以考虑停止该进程。使用 kill 命令来完成此项任务,也可以使用killall、pkill命令

3.3.1 kill:通过pid终止进程

语法

kill [参数] [进程pid]

参数

  • -l <信息编号>  若不加<信息编号>选项,则 -l 参数会列出全部的信息名称。
  • -s <信息名称或编号>  指定要送出的信息。

使用 kill -l 命令列出所有可用信号。

[root@root /]# kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

最常用的信号是:

  • 1 (HUP):重新加载进程。
  • 9 (KILL):杀死一个进程。
  • 15 (TERM):正常停止一个进程,默认。
  • 2(INT):终止信号,用于终止前台进程。

kill -9 进程id 表示强制结束进程(最常用)

kill 可将指定的信息送至程序。预设的信息为 SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用 SIGKILL(9) 信息尝试强制删除程序。程序或工作的编号可利用 ps 指令或 jobs 指令查看。

案例

强制停止mysql进程

# 查看mysql进程,找到mysql进程的pid
[root@root /]# ps -aux |grep mysql
root      1219  0.0  0.0 115544  1712 ?        S    Jul04   0:00 /bin/sh /www/server/mysql/bin/mysqld_safe --datadir=/www/server/data --pid-file=/www/server/data/root.pid
mysql     1899  0.0  5.3 1242276 205724 ?      Sl   Jul04  25:52 /www/bin/mysqld --basedir=/www/semysql --datadir=/www/server/data --plugin-dir=/www/serveib/plugin --user=mysql --log-error=root --open-f-limit=6535 --pid-file=/www/servert.pid --socket=/tmp/mysql.sock --port=3308
root      9849  0.0  0.0 112812   976 pts/0    S+   02:55   0:00 grep --color=auto mysql
#强制终止mysql进程
[root@root /]# kill -9 1899

#再次查看
[root@root /]# ps -aux |grep mysql
root      1219  0.0  0.0 115544  1712 ?        S    Jul04   0:00 /bin/sh /www/server/mysql/bin/mysqld_safe --datadir=/www/server/data --pid-file=/www/server/data/root.pid
root      9849  0.0  0.0 112812   976 pts/0    S+   02:55   0:00 grep --color=auto mysql

3.3.2 killall:通过进程名字终止进程

语法

killall [参数] 进程名字

参数

  • -I :忽略大小写

  • -g :结束进程组

  • -i :交互式,询问是否杀死进

  • -l :列出所有的信号名称

  • -q :进程没有结束时,不输出任何信息

  • -r :将进程名模式解释为扩展的正则表达式。

  • -s :发送指定信号

  • -u :结束指定用户的进程

  • -w :等待所有的进程都结束

3.3.3 pkill:通过进程名终止进程

pkill通过进程的名字终止进程,和killall类似

语法

pkill [参数] 进程名字

参数

  • -n 仅向找到的最大(结束)进程号发送信号

  • -o 仅向找到的最小(起始)进程号发送信号

  • -P 指定父进程号发送信号

  • -g 指定进程组

  • -t 指定开启进程的终端

top:显示系统当前的进程状况

top:显示系统的健康状况,虽然top命令和ps命令的基本作用是相同的,都显示系统当前的进程状况,但是top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态。

语法

top [参数]

参数

  • -d <时间>: 指定每个几秒更新一次,默认情况下是3秒

  • -q : 没有任何延迟的更新。

  • -i : 不显示任何闲置 (idle) 或无用 (zombie) 的行程

  • -n : 显示更新的次数,完成后将会退出top。

  • -P:以cpu的使用率排序,默认

  • -M:以内存的使用率排序

  • -N:以pid排序

:当使用top命令后,如果不停止就会一直运行下去,如果想退出当前运行界面,可以按q

案例

查看当前系统的健康状况

[root@root /]# top 
top - 03:14:42 up 35 days, 13:59,  1 user,  load average: 0.02, 0.07, 0.05
Tasks:  88 total,   1 running,  86 sleeping,   0 stopped,   1 zombie
%Cpu(s):   2.5/0.7     3[||||                                                                 ]
KiB Mem :  3880244 total,   152044 free,   601636 used,  3126564 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  2988800 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                  
 7026 root      10 -10  133560  17292  10044 S   1.7  0.4 506:19.50 AliYunDun                                                                                
 1899 mysql     20   0 1242276 205724   8240 S   0.3  5.3  25:52.91 mysqld                                                                                   
11850 root      20   0  161992   2204   1560 R   0.3  0.1   0:00.02 top                                                                                      
15948 root      20   0  805676  10104   5408 S   0.3  0.3  47:49.00 aliyun-service                                                                           
    1 root      20   0   51748   3980   2624 S   0.0  0.1   7:38.08 systemd      

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值