Linux进程管理

什么是进程,进程和程序有什么区别?

首先来说程序,程序是保存可执行的代码和数据的静态文件,而进程是程序运行的过程,是动态的,有生命周期及运行状态的;一个程序运行后可以创建一个或者多个进程,例如当有大量客服访问一个web服务器时,它的http程序可以分出多个进程来提供服务。

进程的分类

1、交互式进程:由一个shell终端启动的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行在后台。 
2、批处理进程:该进程是一个进程集合,负责按顺序启动其他的进程,此类进程不必与用户交互, 因此经常在后台运行。比如数据库搜索引擎
3、守护进程:守护进程是一直运行的一种进程,经常在linux系统启动时启动,在系统关闭时终止。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。例如httpd进程,一直处于运行状态,等待用户的访问。还有经常用的crond进程,这个进程类似与windows的计划任务,可以周期性的执行用户设定的某些任务。

前台进程和后台进程的区别:

前台进程:当一个进程运行在用户眼前时,这就是前台进程;如果想运行其他程序,必须关闭当前进程或者将当前进程放到后台运行。

后台进程:在后台运行的进程,后台进程不影响当前用户运行的其他进程

当我们正在运行一个进程时,可能会等待太长时间,如果还有其他的进程需要我们操作的话,执行Ctrl+z,或者在命令执行之前我们在命令最后加入&,我们就可以将这个进程变为后台进程,但是并不是所有的进程都可以后台运行,比如top

父进程和子进程的关系:

他们是管理和被管理的关系,子进程由父进程创建,通常父进程在子进程运行期间处于睡眠状态(Sleeping),当子进程结束后,Linux系统会自动回收进程消耗的 内存和IO,但是进程本身占用的资源(task_struct和栈内存)不会被回收,需要被父进程来进行回收,父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的程序代码。

僵尸进程和孤儿进程

任何一个子进程(init除外)在退出之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作,直到关机才会回收。

僵尸进程:当子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中从而占用系统资源,这种进程称之为僵死进程。如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程

一般僵尸进程很难直接kill掉,不过您可以kill僵尸进程的父进程。父进程死后,僵尸进程成为”孤儿进程”,过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。

进程的属性

PID:进程的ID,唯一的数值,用来区分进程
PPID:代表父进程以及父进程的ID
UID:启动进程用户的ID
GID:进程所属用户的组ID
nice:进程执行的优先级
tty:进程所连接的终端

进程的五种运行状态:

1、可运行(R):处于可运行状态的进程,一旦有机会,就会访问CPU。多个进程可以(而且经常)处于可以运行状态,但是因为在任何给定时间内只有一个进程可以在CPU上运行,所以实际上这些进程中只有一个在任何给定的实例上运行。
2、自愿(可中断的)睡眠(s):从名称中可以看出,处于自愿睡眠状态的进程选择处于该状态。通常,这一进程在某事发生之前无事可做。
3、非自愿(不可中断或强制)睡眠\(D\):内核迫使进程进入非自愿睡眠状态。该进程并没有选择休眠,它情愿运行以便做完事情。当资源被释放时,内核会唤醒进程并将设置为可运行状态。
4、停止的(挂起的)进程(T):用户有时决定挂起进程,被挂起的进程在被用户重新启动前不会执行任何操作。
5、僵尸进程(Z): 每个快要终止的进程会经历一个短暂的僵尸状态,然而有时有些进程会一直停留在僵尸状态。

进程的管理

1 、查看进程

jobs命令 

用于显示Linux中的任务列表及任务状态,包括后台运行的任务。该命令可以显示任务号及其对应的进程号。其中,任务号是以普通用户的角度进行的,而进程号则是从系统管理员的角度来看的。一个任务可以对应于一个或者多个进程号。

在Linux系统中执行某些操作时候,有时需要将当前任务暂停调至后台,或有时须将后台暂停的任务重启开启并调至前台,这一序列的操作将会使用到 jobs、bg、和 fg 三个命令以及两个快捷键来完成。

jobs用法

1
jobs(选项)(任务ID)

选项

1
2
3
4
5
-l:显示进程号;
-p:仅任务对应的显示进程号;
-n:显示任务状态的变化;
-r:仅输出运行状态(running)的任务;
-s:仅输出停止状态(stoped)的任务。

使用jobs命令显示当前系统的任务列表,输入如下命令:

1
[root@localhost ~]# jobs -l    #显示当前系统的任务列表

  

ps静态查看:
复制代码
命令选项:
a: 显示跟当前终端关联的所有进程
u: 基于用户的格式显示
x: 显示所有进程,不以终端机来区分
U: 显示某用户ID所有的进程
A: 显示所有程序
e: 此参数的效果和指定”A”参数相同
f: 用ASCII字符显示树状结构,表达程序间的相互关系
o: 自定义输出格式
复制代码

ps -aux 输出解析

复制代码
[root@localhost ~]# ps -aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.1  0.3 193476  6560 ?        Ss   21:23   0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?        S    21:23   0:00 [kthreadd]
root          4  0.0  0.0      0     0 ?        S<   21:23   0:00 [kworker/0:0H]
root         47  0.0  0.0      0     0 ?        SN   21:23   0:00 [ksmd]
root        682  0.0  0.0      0     0 ?        R    21:23   0:02 [kworker/1:3]
root        803  0.0  0.0  55528   888 ?        S<sl 21:23   0:00 /sbin/auditd
root       1262  0.0  0.2 222760  4364 ?        Ssl  21:23   0:00 /usr/sbin/rsyslogd -n
root 1798 0.0 0.1 115576 2144 tty1 Ss+ 21:23 0:00 -bash root 1822 0.0 0.2 158924 5604 ? Ds 21:23 0:00 sshd: root@pts/0 root 1904 0.0 0.0 155372 1856 pts/0 R+ 21:58 0:00 ps -aux
USER: 进程拥有者
PID: pid 
%CPU: 占用的 CPU 使用率
%MEM: 占用的内存使用率 VSZ: 占用的虚拟内存大小 RSS: 占用的内存大小 TTY: 终端的号码 STAT: 该进程的状态: D: 不可中断的静止 R: 正在执行中 S: 静止状态 T: 暂停执行 Z: 不存在但暂时无法消除 W: 没有足够的内存分页可分配 <: 高优先序的进程 N: 低优先序的进程 L: 有内存分页分配并锁在内存内 (即时系统或捱A I/O) s: 表示进程是控制进程 l: 表示进程是多线程 +: 表示当前进程运行在前台 START: 进程开始时间
TIME: 执行的时间
COMMAND:所执行的指令
复制代码

 top 动态查看

参数

d 指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。 
p 通过指定监控进程ID来仅仅监控某个进程的状态。 
q 该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。 
S 指定累计模式 
s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。 
i 使top不显示任何闲置或者僵死进程。 
c 显示整个命令行而不只是显示命令名 

举例:

top -d 2  //每隔2秒显式所有进程的资源占用情况
top -c  //每隔5秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名)
top -p 12345 -p 6789//每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况
top -d 2 -c -p 123456 //每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数

 

top详解

复制代码
top - 12:06:45 up 17:09,  2 users,  load average: 0.00, 0.01, 0.05
Tasks: 122 total,   1 running, 121 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.1 sy,  0.0 ni, 99.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2010560 total,  1337960 free,   210084 used,   462516 buff/cache
KiB Swap:  2228220 total,  2228220 free,        0 used.  1632748 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                                            
   516 root      20   0       0      0      0 S   0.3  0.0   0:06.02 xfsaild/dm-0                                                                                                                                                       
  1247 root      20   0  574200  17428   6132 S   0.3  0.9   0:09.63 tuned                                                                                                                                                              
  7267 root      20   0       0      0      0 S   0.3  0.0   0:00.07 kworker/1:1                                                                                                                                                        
  7328 root      20   0  162024   2276   1548 R   0.3  0.1   0:00.08 top                                                                                                                                                                
     1 root      20   0  193620   6684   4120 S   0.0  0.3   0:04.86 systemd                                                                                                                                                            
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.06 kthreadd                                                                                                                                                           
     4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H                                                                                                                                                       
复制代码
第一行解释:
top - 12:10:49 up 17:13,  2 users,  load average: 0.02, 0.02, 0.05
#   当前时间    以运行时间  用户数量     相应最近5、10和15分钟内的平均负载

第二行解释:
Tasks: 121 total,   2 running, 119 sleeping,   0 stopped,   0 zombie
#任务进程 121        2个运行中   119个睡眠       0个停止        0个僵尸进程
第三行解释:
复制代码
%Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
这里显示不同模式下所占cpu时间百分比,这些不同的cpu时间表示:
   us, user: 运行(未调整优先级的) 用户进程的CPU时间
   sy,system: 运行内核进程的CPU时间
   ni,niced:运行已调整优先级的用户进程的CPU时间
   wa,IO wait: 用于等待IO完成的CPU时间
   hi:处理硬件中断的CPU时间
   si: 处理软件中断的CPU时间
   st:这个虚拟机被hypervisor偷去的CPU时间(译注:如果当前处于一个hypervisor下的vm,实际上hypervisor也是要消耗一部分CPU处理时间的)。
复制代码
第四五行解释:
KiB Mem :  2010560 total,  1337960 free,   210084 used,   462516 buff/cache
KiB Swap:  2228220 total,  2228220 free,        0 used.  1632748 avail Mem 
第一行是物理内存使用,第二行是虚拟内存使用(交换空间)。 
物理内存显示如下:全部可用内存(total)、空闲内存(free)、已使用内存(used)、缓冲内存(buff/cache)。交换部分显示的是:全部、空闲、已使用和缓冲交换空间。
剩余解释:
复制代码
 PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                              
 839 root      20   0  305396   6548   5148 S   0.3  0.3   1:33.39 vmtoolsd                                 
8325 root      20   0  162024   2276   1548 R   0.3  0.1   0:00.06 top                
   1 root      20   0  193620   6684   4120 S   0.0  0.3   0:05.26 systemd 
   2 root      20   0       0      0      0 S   0.0  0.0   0:00.07 kthreadd                   
   4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H                         
   7 root      rt   0       0      0      0 S   0.0  0.0   0:11.30 migration/0
PID:进程ID,进程的唯一标识符
USER:进程所有者的实际用户名。
PR:进程的调度优先级。这个字段的一些值是'rt'。这意味这这些进程运行在实时态。
NI:进程的nice值(优先级)。越小的值意味着越高的优先级。负值表示高优先级,正值表示低优先级
VIRT:进程使用的虚拟内存。进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES:驻留内存大小。驻留内存是任务使用的非交换物理内存大小。进程使用的、未被换出的物理内存大小,单位kb
SHR:SHR是进程使用的共享内存。共享内存大小,单位kb
S:这个是进程的状态。它有以下不同的值:
   D - 不可中断的睡眠态。
   R – 运行态
   S – 睡眠态
   T – 被跟踪或已停止
   Z – 僵尸态
%CPU:自从上一次更新时到现在任务所使用的CPU时间百分比。
%MEM:进程使用的可用物理内存百分比。
TIME+:任务启动后到现在所使用的全部CPU时间,精确到百分之一秒。
COMMAND:运行进程所使用的命令。进程名称(命令名/命令行)
复制代码

top实用参数:

复制代码
h或者? 显示帮助画面,给出一些简短的命令总结说明。 
k 终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。 
i 忽略闲置和僵死进程。这是一个开关式命令。 
q 退出程序。 
r 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。 
S 切换到累计模式。 
s 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。 
f或者F 从当前显示中添加或者删除项目。 
o或者O 改变显示项目的顺序。 
l 切换显示平均负载和启动时间信息。 
m 切换显示内存信息。 
t 切换显示进程和CPU状态信息。 
c 切换显示命令名称和完整命令行。 
M 根据驻留内存大小进行排序。 
P 根据CPU使用百分比大小进行排序。 
T 根据时间/累计时间进行排序。 
W 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。
复制代码

2、控制进程

systemctl  是系统服务管理器指令,它实际上将 service 和 chkconfig 这两个命令组合到一起。

任务 旧指令 新指令
使某服务自动启动 chkconfig –level 3 httpd on systemctl enable httpd.service
使某服务不自动启动 chkconfig –level 3 httpd off systemctl disable httpd.service
检查服务状态 service httpd status systemctl status httpd.service (服务详细信息) systemctl is-active httpd.service (仅显示是否 Active)
 某服务重新加载配置文件  service httpd reload  systemctl daemon-reload httpd.server
启动某服务 service httpd start systemctl start httpd.service
停止某服务 service httpd stop systemctl stop httpd.service
重启某服务 service httpd restart systemctl restart httpd.service
显示所有已启动的服务 chkconfig –list systemctl list-units –type=service

3、终止进程

  • kill 命令 杀死进程
  • killall命令 杀死特定的一类进程
  • pkill命令 终止进程,按终端号踢出用户

kill 

复制代码
[root@bogon ~]# 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"、"9"、"15"这三个信号 

信号代号信号名称说 明
1 SIGHUP 该信号让进程立即关闭.然后重新读取配置文件之后重启
2 SIGINT 程序中止信号,用于中止前台进程。相当于输出 Ctrl+C 快捷键
8 SIGFPE 在发生致命的算术运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为 0 等其他所有的算术运算错误
9 SIGKILL 用来立即结束程序的运行。本信号不能被阻塞、处理和忽略。般用于强制中止进程
14 SIGALRM 时钟定时信号,计算的是实际的时间或时钟时间。alarm 函数使用该信号
15 SIGTERM

正常结束进程的信号,kill 命令的默认信号。

如果进程已经发生了问题,那么这个信号是无法正常中止进程的,这时我们才会尝试 SIGKILL信号(信号 9) 

18 SIGCONT 该信号可以让暂停的进程恢复执行。本信号不能被阻断
19 SIGSTOP 该信号可以暂停前台进程,相当于输入 Ctrl+Z 快捷键。本信号不能被阻断

kill是用来杀死进程的命令。可以根据不同的信号,kill 命令可以完成不同的操作,默认信号是15,正常停止。

[root@bogon ~]# kill  32442    #正常停止pid为32442的进程
[root@bogon ~]# kill -1 32411  #重启pid为32411的进程
[root@bogon ~]# kill -9 32411  #强制停止pid为32411的进程

killall:杀死特定的一类进程

-i:交互式,询问是否要杀死某个进程;
-l:忽略进程名的大小写;

举例:杀死http进程

复制代码
[root@localhost ~]# ps aux | grep "httpd" | grep -v "grep"
root 1600 0.0 0.2 4520 1696? Ss 19:42 0:00 /usr/local/apache2/bin/httpd -k start
daemon 1601 0.0 0.1 4520 1188? S 19:42 0:00 /usr/local/apache2/bin/httpd -k start
daemon 1602 0.0 0.1 4520 1188? S 19:42 0:00 /usr/local/apache2/bin/httpd -k start
daemon 1603 0.0 0.1 4520 1188? S 19:42 0:00 /usr/local/apache2/bin/httpd -k start
daemon 1604 0.0 0.1 4520 1188? S 19:42 0:00 /usr/local/apache2/bin/httpd -k start
daemon 1605 0.0 0.1 4520 1188? S 19:42 0:00 /usr/local/apache2/bin/httpd -k start 
#查看httpd进程
[root@localhost ~]# killall httpd
#杀死所有进程名是httpd的进程
[root@localhost ~]# ps aux | grep "httpd" | grep -v "grep"
#查询发现所有的httpd进程都消失了
复制代码

pkill命令:终止进程,按终端号踢出用户

1
-t 终端号:按照终端号踢出用户;

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost ~]# w
20:06:34 up 28 min, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root ttyl - 19:47 18:52 0.01s 0.01s -bash
root pts/0 192.168.0.100 19:47 0.00s 0.09s 0.04s w
root pts/1 192.168.0.100 19:51 14:56 0.02s 0.02s -bash
#使用w命令査询本机已经登录的用户
#当前主机已经登录了三个root用户,一个是本地终端ttyl登录,另外两个是192.168.0.100登陆的远程登录 
<br>[root@localhost ~]# pkill -9 -t pts/1
#强制杀死从pts/1虚拟终端登陆的进程
<br>[root@localhost ~]# w
20:09:09 up 30 min, 2 users, load average: 0.00, 0.00,0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root ttyl - 19:47 21:27 0.01s 0.01s -bash
root pts/0 192.168.0.100 19:47 0.00s 0.06s 0.00s w
#虚拟终端pts/1的登录进程已经被杀死了

4、调整进程优先级

Linux系统进程的优先级取值:-20 到 19,数越大优先级越低。
可以通过top命令来查看,NI那一列。
改变进程的优先级的方法有两种:(需要root权限)
1、top命令
输入r,然后根据提示输入进程ID,再输入优先级数值。
2、renice命令
renice -n 2 -p 1234 (-n:后面是优先级的值;-p,是进程号)

posted @   李志锋  阅读(223)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示