4

Linux系列之进程管理 - chuckQu

 1 year ago
source link: https://www.cnblogs.com/chuckQu/p/16535426.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Linux系列之进程管理

进程是正在运行的程序,Linux系统通常有数百个进程同时运行。本文就来介绍下Linux是如何进行进程管理的。

我们可以看到:

  • 查看进程(Viewing processes)
  • 查找进程(Finding processes)
  • 管理进程(Managing processes)
  • 进程的优先级(Prioritizing processes)
  • 杀死进程(Killing processes)
  • 在后台运行进程(Running processes in the background)
  • 调度进程(Scheduling processes)

Linux内核在创建进程时,会按顺序给每个进程分配一个唯一的进程ID(PID)。一般来说,在进程上执行任何操作,我们必须指定PID,有时我们可以使用名称。

ps命令是查看进程的主要工具。不使用任何选项来运行该命令,会列出当前登录用户所启动(调用)的进程,以及终端上正在运行的进程。

如果我们添加了aux选项:

  • a = 显示所有用户的进程
  • u = 显示进程的用户/所有者
  • x = 显示未连接到终端的进程
image.png

进程按照它们被启动的顺序进行展示,因此你会看到列表是根据PID进行排序的。

让我们简单来看看下面几列的信息:

  • USER:调用进程的用户。
  • PID:进程的ID。
  • %CPU:进程占用CPU的百分比。
  • %MEM:进程占用内存的百分比。
  • COMMAND:启动进程的命令。

我们可以使用grep命令来查找指定的进程,假设我们想要查找所有名称中包含mfsconsole的进程。

ps aux | grep msfconsole
image.png

我们可以使用top命令来动态地罗列出,按照资源使用情况排序的进程,从最大的开始罗列。默认情况下,该列表将每3秒刷新一次。

top
image.png

内核对进程的优先级有最终决定权,但是我们可以使用nice命令,来建议应该提升进程的优先级。nice命令的值范围是从-20(最有可能得到优先权)到+19(最不可能得到优先权)。

较高的nice值转换为低优先级,较低的nice值转换为高优先级。

当一个进程启动后,所有的标准进程都以nice值0来进行启动。

我们可以使用nice命令来设置一个进程启动时的nice值,我们可以使用renice来调整一个运行中的进程的nice值。

当我们使用nice命令启动一个进程但没有提供任何值时,默认的nice值是10。

nice命令要求你递增nice值,renice命令想要一个绝对的nice值。

设置优先级

我们可以使用nice命令来调整一个程序的nice值。这允许我们提高或降低内核提供给该进程的优先级,相对于其他进程而言。

在左边,我执行watch -n1 free 来展示系统内存使用情况的细节。在右边,我让top命令运行,你可以看到watch命令的PID是9717,nice的值为0。

image.png

让我们继续执行watch命令,只不过这次是用nice命令。

nice -15 watch -n1 free
image.png

现在我们可以看到watchnice值为15。这里要牢记的几件事:

  • 这个watch命令的PID与之前的watch命令不同。这是因为nice会启动一个新的进程,而不是更改一个现有的进程。
  • nice命令后面的-15意味着15。如果我们想要指定一个负数(高优先级),我们可以使用双中划线-
  • 下面是执行sudo nice --10 watch -n1 free后的样子。是的,如果你要提高优先级,你必须使用sudo。任何人都可以降低优先级,但只有sudo可以提高优先级。
image.png

改变优先级

renice命令接收-2019的绝对值,并接收进程的PID

让我们再次运行watch命令。

watch -n1 free

让我们来检查下nice值,既然我们没有指定nice值,它应该为0。比起使用top,这里我将会使用psgrep,用以简化输出。

image.png

我们可以看到,第八列的值为0,该值为nice的值,PID的值位于第三列。让我们使用renice试试:

sudo renice -15 14318
image.png

我们可以看到,现在nice的值是-15。我们也可以使用top工具来改变nice值。

top中,按下R键,并提供一个PID

image.png

按下回车键,并提供一个新的nice值:

image.png

top成功的改变了nice值:

image.png

你可以通过kill命令来停止一个有问题的进程。kill命令有64种不同的kill信号,以及语法是kill -signal PID 。如果没有显示的提供信号位,将会默认为SIGTERM 。这里我将重点介绍以下几种:

信号名称 数值 描述
SIGHUP 1 挂断(HUP)信号。它停止指定的进程,并以相同的PID重新启动它。
SIGINIT 2 中断(INT)信号。这是一个微弱的kill信号,不保证能起作用,但确实有这样的情况。
SIGQUIT 3 核心转储。终止进程并将进程信息保存在内存中,然后它将这些信息保存在当前工作目录下一个名为core的文件中。
SIGTERM 15 终止(TERM)信号。它是kill命令的默认kill信号。
SIGKILL 9 这是一个绝对的kill信号。它通过将进程的资源发送到一个特殊的设备/dev/null来迫使进程停止。

下面的命令会通过HUP信号来重启我们的watch命令。

kill -1 14318

下面的命令会确保进程被终止。

kill -9 16318

如果我们不知道PID,我们可以使用killall命令,它接收进程的名称。

killall -9 watch
image.png

在后台运行进程

当你执行一个命令时,shell会进行等待,直到命令完成后才提供另一个命令提示。我们可以在后台运行一个进程,它将继续运行而不需要终端,把终端腾出来做其他工作。我们在命令的末尾添加&来做到这一点。

geany sample.txt &
image.png

geany不再占用整个终端。

我们如何让它回到前台?可以使用带有PID的fg命令。

fg 18345

你也可以使用bg命令来移动一个进程到后台。

bg 18345

在Linux中,我们可以使用atcrond来调度进程。crond有点复杂,这里重点介绍at

at命令对于安排一项工作在未来某个时间点运行一次很有用。它设置了atd守护进程。守护进程是一个位于后台的程序,在没有任何用户界面的情况下做自己的事情。

下面是at命令执行进程的时间的语法,时间可以以多种格式提供。

时间格式 含义
at 7:20pm Run at 7:20 PM of current day.
at 7:20pm June 25 Run at 7:20 PM on June 25
at now + 20 minutes Run in 20 minutes
at 7:25pm 06/10/2021 Run at 7:25 pm on June 10, 2021
at noon
image.png

我们可以看到,at将我们带入了交互模式,在这里我们输入了我们希望在指定时间执行的命令。完成后按下CTRL+D。

使用atq来罗列出所有预定的at工作。

image.png

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK