linux进程管理

发布时间 2023-12-17 20:45:25作者: 飔鬏

Linux是一种多用户操作系统,也是一种多任务系统。多任务意味着可以同时运行多个程序。运行程序的实例通常被称为 进程 。Linux提供了相关的工具列出运行中的进程,监视系统的使用情况以及在必要时停止(或杀死)进程。可以通过shell启动、暂停、停止或者杀死进程,此外,还可以将进程放到后台以及带到前台。

进程

进程是命令的运行实例。例如,可在系统上运行一条vi命令,但若该命令被15名不同的用户同时运行,则该命令将由15个不同的运行进程来表示。

系统中的进程通过一个进程ID进行识别,该进程ID对于当前系统来说是唯一的。除了进程ID之外,还有其他属性与一个进程相关联。当运行一个进程时,该进程将与一个特定的用户账号和组账号相关联。该账号信息有助于确定进程可以访问哪些系统资源。

用来显示运行进程相关信息的命令主要从/proc文件系统中存储的原始数据获取信息。每个进程都在/proc的一个子目录(以该进程的进程ID命名)中存储了自己的信息。

列出进程

使用ps列出进程

用来检查运行中进程的最常用实用工具是ps命令,可以查看哪些进程正在运行、进程使用的资源以及谁正在运行这些进程。

[root@fedora32 ~]# ps u #u 显示用户以及其他信息

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

root 3329 0.0 0.3 42728 7636 pts/0 S 10:55 0:00 sudo -i

root 3331 0.0 0.2 16300 4296 pts/0 S 10:55 0:00 -bash

root 3432 0.0 0.1 17932 3472 pts/0 R+ 11:27 0:00 ps u
  • STAT列表示出进程的状态,其中S表示一个当前运行的进程,R表示一个睡眠进程。其中加号(+)表示进程与前台操作相关联。
  • USER列显示了启动进程的用户名。每一个进程都由一个称为进程ID(PID)的唯一ID号所表示。若需要杀死一个失控的进程或向某一进程发送另一种信号,则可以使用PID。
  • %CPU和%MEM列分别显示了进程使用的处理器和随机存取存储器的百分比。
  • VSZ(Virtual Set Size,虚拟内存大小)显示了镜像进程的大小(以KB为单位)。RSS(Resident Set Size)显示了内存中程序的大小。VSZ和RSS值可能会不同,因为VSZ是分配给进程的内存数量,而RSS是进程实际使用的内存数量。RSS内存表示不能被交换的物理内存。
  • START显示进程开始运行的时间,而TIME显示了进程运行的累计系统时间。

查看在Linux系统中运行的当前用户的所有进程:

[root@fedora32 ~]# ps ux | less

查看系统中运行的所有用户的进程:

[root@fedora32 ~]# ps aux | less

在使用ps命令可以进行自定义,显示所选列的信息,以及按照某一列对信息进行排序。通过使用-o可以使用关键字表示想要通过ps命令列出的列,-e列出每一个运行中的进程。

[root@fedora32 ~]# ps -eo pid,user,uid,group,gid,vsz,rss,comm | less

若需要按照某一特定列进程排序,可使用sort=选项。

[root@fedora32 ~]# ps -eo pid,user,uid,group,gid,vsz,rss,comm --sort=-vsz | less

使用top列出和更改进程

Top命令提供一种面向屏幕的方法来显示系统中运行的进程。在使用top命令时,默认情况下按照进程当前所使用的CPU时间来显示进程,还可以使用top命令来杀死(完全终止)或者改变(重新确定优先次序)该进程。

关于系统的一般信息将在top输出的顶部显示,紧跟着每个运行进程的信息,在输出顶部,可以查看系统运行的时间,目前登录到系统的用户数量以及在过去的1、5、10分钟内系统上的需求数量。

其他一般信息还包括当前运行的进程(任务)数量、CPU的使用情况以及RAM和Swap空间可用的数量和正在使用的数量。

在一般信息之后显示了按照CPU的使用百分比排序的进程列表,默认情况下,所有信息每5秒钟重新显示。

[root@fedora32 ~]# top

top - 11:56:25 up 5:24, 1 user, load average: 0.00, 0.00, 0.00

Tasks: 109 total, 1 running, 108 sleeping, 0 stopped, 0 zombie

%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 96.5 id, 0.0 wa, 1.5 hi, 2.0 si, 0.0 st

MiB Mem : 1976.8 total, 1197.0 free, 195.5 used, 584.3 buff/cache

MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 1589.1 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

625 root 20 0 262748 24128 11984 S 0.3 1.2 0:03.31 tuned

1 root 20 0 106836 15480 10520 S 0.0 0.8 0:01.66 systemd

使用top命令可以完成的操作,从而以不同的方式显示信息并更改运行中的进程。

  • 单击h,查看帮助选项,然后单击任何键,返回top显示界面
  • 单击M,按照内存使用情况(而不是按照CPU使用情况)进行排序,然后单击P返回到按照CPU使用情况进行排序
  • 单击数字1,切换显示所有CPU的使用情况(假设系统上有多个CPU)
  • 单击R,对输出进行反向排序
  • 单击u并输入一个用户名,显示针对某一特定用户的进程

常见的作法是使用top命令找到那些使用过多内存或处理能力的进程,然后以某种方式对这些进程采取措施。

  • 改变进程:首先确认要改变的进程ID,然后单击r。当“PID to renice:”消息出现时,输入想要改变进程的ID。当被提示“Renice PID to value:”时,输入从-20到19之间的一个数字
  • 杀死进程:首先确认要杀死的进程ID,然后单击k。输入15彻底终止,或者输入9彻底杀死进程。

使用System Monitor列出进程

Linux系统上使用GNOME桌面,可以使用System Monitor(gnome-system-monitor),从而提供一种更趋图形化的方法来显示系统上的进程。通过单击列可以对进程进行排序,而右击进程可以停止、杀死或者改变进程。

管理后台和前台进程

可以使用多种方法将一个活动程序放置到后台,首次运行命令时,可在命令行的末尾添加一个与号(&)。也可以使用at命令运行其他命令,使这些命令不连接到shell。

为了停止一个运行中的命令并将其放到后台,可以单击Ctrl+Z。在命令停止之后,可以将其重新带回前台运行(使用fg命令)或者开始在后台运行(使用bg命令)。在随后通过shell运行其他命令时,运行在后台的任何命令都可能产生输出。例如,在vi会话期间显示了来自后台运行的某一命令的输出,只需单击Ctrl+L就可以刷新屏幕,去除该输出。

为了避免出现以上输出,应该将任何后台运行的进程的输出发送到一个文件或者null(向命令行的末尾添加 2>/dev/null)。

启动后台进程

要使某些程序在使用shell的过程中始终运行,可以将他们放到后台。为了将某一程序放到后台,需要在命令行的末尾输入一个与号(&)。

#查找Linux系统中的所有文件(从/usr开始查找),然后打印这些文件名,最后将这些文件名放到/tmp/allusrfiles 文件中。

[root@fedora32 ~]# find /usr > /tmp/allusrfiles &

[1] 3780

#与号(&)可使该命令在后台运行,注意,当启动该命令后,显示了作业编号([1])和进程ID号(3780)。

#查看后台运行的命令

[root@fedora32 ~]# jobs

[1] Stopped (tty output) vi /tem/myfile #显示一条放到后台并在编辑过程中单击Ctrl+Z停止运行的文本编辑命令(vi)

[4]- Running nroff -man /usr/man2/* > /tmp/man2 & #显示当前正在后台运行的nroff命令

[5]+ Running nroff -man /usr/man4/* > /tmp/man4 #持续在shell(前台)上运行,可单击Ctrl+Z停止作业

【数字5后面的加号(+)表示最近放到后台的作业,而数字4后面的减号(-)表示在最近的后台作业之前放到后台的作业。数字1需要终端输入,所以不能在后台运行,该作业将被停止,直到再次带回前台后开始运行】

[root@fedora32 ~]# jobs -l #查看后台作业的进程ID

[root@fedora32 ~]# ps #查看进程ID,对应那条命令

PID TTY TIME CMD

3715 pts/0 00:00:00 sudo

3717 pts/0 00:00:00 bash

3802 pts/0 00:00:00 ps

使用前台和后台命令

将作业列表中的任何命令带回前台。特别注意在将一些程序放到后台之前,先确保文件被保存。

[root@fedora32 ~]# vi allusrfiles &

[1] 3814

[root@fedora32 ~]# jobs -l

[1]+ 3814 Stopped (tty output) vi allusrfiles

[root@fedora32 ~]# fg %1 #将后台进程放到前台

vi allusrfiles

若想引用一个后台作业(以便取消该作业或将其带回前台),可以在作业编号之前使用一个百分号(%),此外,还可以使用以下方法引用。

  • % —— 引用最近放到后台的命令(当输入jobs命令时,表示为一个加号)
  • %string —— 引用命令以某一特定的string开头的作业,其中string必须时唯一的。
  • %?string —— 引用命令行的任何位置包含string的作业。该字符串必须明确,否则就匹配失败。
  • %-- —— 引用在最近停止的作业之前停止的作业

若停止了一个命令,可以通过使用bg命令在后台再次运行该命令。

[root@fedora32 ~]# bg %1

杀死和改变进程

Kill命令可以向任何进程发送一个终止进程的kill信号(假设拥有杀死该进程的权限)。此外,可以向进程发送不同的信号来更改其行为,可以使用nice和renice命令设置或更改进程的处理器优先级。

使用kill和killall命令杀死进程

Kill和killall命令常用来终止一个运行中的进程,但这两个命令实际上是用来向运行中的进程发送一些有效信号,除了告诉进程终止之外,还可以告诉进程重新读取配置文件、暂停(停止)或者在暂停之后继续运行等。

信号通过数字和名称来表示。一般来说,通过一条命令发送的最常用信号包括SIGKILL(9)、SIGTERM(15)和SIGHUP(1)。默认信号是SIGTERM,即彻底终止一个进程,而如果想立即杀死一个进程,可以使用SIGKILL。SIGHUP信号告诉进程重新读取其配置文件。SIGSTOP暂停进程,而SIGCONT则继续一个被暂停的进程。

不同的进程可以对不同的信号予以响应,然而,任何进程都不能阻止SIGKILL和SIGSTOP信号。

信号

数字

描述

SIGHUP

1

挂断对控制终端或者控制进程死亡的探测

SIGIN

2

通过键盘中断

SIGQUIT

3

通过键盘退出

SIGABRT

6

调用abort(3)生成的中止信号

SIGKILL

9

杀死信号

SIGTERM

15

终止信号

SIGCONT

19,18,25

继续被停止的进程

SIGSTOP

17,19,23,

停止进程

注意,对于SIGCONT和SIGSTOP来说,存在多种可能的信号数字,不同的数字被用于不同的计算机体系结构。

使用kill命令并根据PID向进程发送信息

通过使用诸如ps和top的命令,可以找到想要的向其发送信号的进程,然后使用该进程的进程ID作为kill命令的一个参数,以及想要发送的信号。

[root@fedora32 ~]# top

使用kill命令的不同形式杀死该进程:

[root@fedora32 ~]# kill 2742

[root@fedora32 ~]# kill -15 2742

[root@fedora32 ~]# kill -SIGKILL 2742

Kill命令发送的默认信号是15(SIGTERM),所以前两个命令可以得到相同的结果。但有时SIGTERM并不能杀死一个进程,所以肯需要使用SIGKILL或者使用-9。

另一个有用的信号是SIGHUP。例如,在GNOME桌面上的某些东西损坏了,可以向gnome-shell发送一个SIGHUP信号,已重新读取其配置文件并重新启动桌面。若gnome-shell的进程ID是1813,可以通过以下两种方式向它发送SIGHUP信号。

[root@fedora32 ~]# kill -l 1833

[root@fedora32 ~]# killall -HUP gnome-shell

使用killall命令并根据名称向进程发送信号

通过使用killall命令,可以根据名称(而不是根据进程ID)向进程发送信号,这样做的优点是不需要查找想要杀死的进程ID,但潜在的缺点是可能会杀死其他进程。

[root@fedora32 ~]# killall -9 testme

使用nice和renice命令设置处理器优先级

当Linux内核尝试决定哪些运行中的进程可以访问CPU时,其中一个需要考虑的因素就是进程上的nice值。每一个在系统中运行的进程都有一个-20~19的nice值。默认情况下,该值被设置为0。

  • Nice值越低,进程就有更多访问CPU的机会。一个进程的nice值超高,就越少得到CPU的关注,所以nice的值为-20的进程比nice值19的进程可以获得更多的关注。
  • 普通用户只能在0-19的范围内设置nice值,而不允许设置负数值。默认情况下,普通用户无法设置一个使某一进程比大部分进程获得更多关注的nice值。
  • 普通用户只能将nice值设置得更高,而不能更低。例如,若某一用户将进程的nice值设置为10,而日后想要设置为5,此时操作失败。同样,任何试图设置一个负数的尝试也会失败。
  • 普通用户只能在用户自己的进程上设置nice值。
  • Root用户可将任何进程上的nice值设置为任意有效值,不管设置得更高或更低。

可以使用nice命令运行一个带有特定nice值的命令。当进程正在运行时,可以使用renice命令以及进程ID更改其nice值。

Updated命令通过收集文件系统中的文件名来手动生成定位数据库。这种情况下,可以让updatedb在后台运行(&),并且不中断系统中其他进程的工作。

[root@fedora32 ~]# nice -n +5 updatedb & #在top展示中,在NI列,nice值为5

[1] 3398

[root@fedora32 ~]# top | grep updatedb

[1]+ Done nice -n +5 updatedb

Root用户可以通过renice命令减少nice值。

[root@fedora32 ~]# renice -n -5 updatedb #更改nice值为-5

使用cgroups限制进程

Cgroups将一个进程确定为一个任务(task),并从属于一个特定的控制组。可以在一个层次结构中设置任务,其中包含一个被称为守护进程(daemon)的任务(为所有后台服务器进程设置了默认限制)以及子任务;子任务设置某一web服务器守护进程(httpd)或者FTP服务守护进程(vsftpd)上的特定限制。

当一个任务启动一个进程时,由该进程启动的其他进程(被称为子进程)将继承其父进程的限制设置。这些限制的内容属于某一控制组的所有进程只能访问特定的处理器和内存集,或者最多只允许访问计算机总处理能力的30%。

可以使用的cgroups限制的资源类型包括:

  • 存储(blkio)——对存储设备(比如硬盘驱动器、USB驱动器等)输入/输出访问进行限制
  • 处理器调度(cpu)——使用调度程序提供对cpu的cgroups任务访问
  • 进程报告(cpuacct)——报告关于CPU的使用情况。该信息可用作根据所使用的处理量向客户收费的依据
  • CPU分配(cpuset)——在带有多个CPU核心的系统中,可将某一任务分配给一组特定的处理器以及相关联的内存
  • 设备访问(devices)——允许cgroups中的任务打开或者创建(mknod)所选择的设备类型
  • 暂停/恢复(freezer)——暂停和恢复cgroups任务
  • 内存使用情况(memory)——显示任务的内存使用。此外还会创建关于所使用内存资源的报告
  • 网络带宽(net_cls)——限制对所选择的cgroups任务的网络访问。其实现过程是通过对网络数据包进行标识,从而识别源自该数据包的cgroups任务。然后使用Linux流量控制程序监视和限制来自每个cgroup 的数据包。
  • 网络流量(net_prio)——设置来自所选择cgroups的网络流量的优先级,并且让管理员实时地更改这些优先级。
  • 名称空间(ns)——将cgroups划分为不同的名称空间。所以某一cgroup内的进程只能查看与该cgroup关联的名称空间。名称空间可包括单独的进程表、挂载表和网络接口。

Cgroups包括编辑配置文件来创建cgroups(/etc/cgconfigconf)或者限制特定用户或者组(/etc/cgrules.conf)。可以使用cgreate命令创建cgroups,从而将这些组添加到/sys/fs/cgroup层次结构中。