Linux进程管理

在本章中,我们将详细讨论Linux中的进程管理。 当您在Linux系统上执行程序时,系统会为该程序创建一个特殊的环境。 该环境包含系统运行程序所需的一切,就好像系统上没有其他程序在运行一样。

每当您在Linux中发出命令时,它都会创建或启动一个新进程。 例如当您尝试使用ls命令列出目录内容时,您就启动了一个进程。 一个进程,简单来说,就是一个正在运行的程序的实例。

操作系统通过称为pid或进程ID的五位ID号来跟踪进程。 系统中的每个进程都有一个唯一的pid。

pid会重复使用,因为当所有可能的数字都用完时,下一个pid会重头开始。 但是在任何时候,系统中都不存在具有相同pid的两个进程,因为Linux使用pid来跟踪每个进程。

## 启动进程 当您启动一个进程(运行命令)时,您可以通过两种方式运行它

  • 前台进程
  • 后台进程

前台进程**

默认情况下,您启动的每个进程都在前台运行。 它从键盘获取输入并将其输出发送到屏幕。

例如您在使用ls命令时就是这种情况。 您可以使用以下命令列出当前目录中的所有文件,

$ls ch*.doc

这将显示所有文件,其名称以ch开头并以.doc结尾

ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc 
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc

该进程在前台运行,输出被定向到我的屏幕,如果ls命令可以接收任何输入(这里它不需要),它会等待来自键盘的输入。

当程序在前台运行并且很耗时时,不能运行其他命令(启动任何其他进程),因为在程序完成处理并输出结果之前,提示将不可用。

后台进程

后台进程无需连接到键盘即可运行。 如果后台进程需要任何键盘输入,它就会一直处于等待状态。

在后台运行一个进程的好处是可以运行其他命令; 你不必等到它完成再开始另一个!

启动后台进程的最简单方法是在命令末尾添加一个与号 (&)。

$ls ch*.doc &

这将显示名称以ch开头并以.doc结尾的所有文件

ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc 
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc

输入命令jobs -l命令可以看到刚启动的后台进程

[1]+  5048   Done                 ls ch*.doc &

第二列是进程Id,通过kill 5048可以杀死此进程。第三列告诉您ls命令后台进程成功完成。 第四个是命令的提示。

注意这些后台运行的Job,会在退出shell的时候终止。

列出正在运行的进程

运行ps(进程状态)命令很容易看到自己的进程如下

$ps
PID       TTY      TIME        CMD
18358     ttyp3    00:00:00    sh
18361     ttyp3    00:01:31    abiword
18789     ttyp3    00:00:00    ps

ps最常用的标志之一是-f(f 代表完整)选项,它提供更多信息,如以下示例所示

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f

这里是ps -f命令显示的所有字段的说明

| NO | 列和描述 | | 1 | UID 此进程所属的用户ID(运行它的人) | | 2 | PID 进程标识 | | 3 | PPID 父进程ID(启动它的进程的ID) | 4 | C 进程的CPU使用率 | | 5 | STIME 进程开始时间 | | 6 | TTY 与进程关联的终端类型 | | 7 | TIME 进程占用的CPU时间 | | 8 | CMD 启动此进程的命令 |

还有其他选项可以与ps命令一起使用

| NO | 选项和说明 | | 1 | -a 显示所有用户的信息 | | 2 | -x 显示有关没有终端的进程的信息 | | 3 | -u 显示附加信息,如-f选项 | | 4 | -e 显示扩展信息 |

停止进程

可以通过几种不同的方式结束进程。 通常,从基于控制台的命令中,发送CTRL+C击键(默认中断字符)将退出命令。 这在进程以前台模式运行时有效。

如果进程在后台运行,您应该使用ps命令获取其进程ID。 之后就可以使用kill命令杀掉进程了,如下

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated

在这里kill命令终止first_one进程。 如果进程忽略了常规的kill命令,您可以使用kill -9后跟进程ID,如下所示

$kill -9 6738
Terminated

## 父进程和子进程

每个Linux进程都有两个分配给它的ID号:进程ID(pid)和父进程ID(ppid)。 系统中的每个用户进程都有一个父进程。

您运行的大多数命令都将shell作为其父级。 检查ps -f命令的输出,其中列出了进程ID和父进程ID。

已死进程和孤儿进程

通常,当子进程被杀死时,会通过SIGCHLD信号更新父进程。 然后父级可以执行其他任务或根据需要重新启动新子级。 然而,有时父进程在其子进程被杀死之前被杀死。 在这种情况下,“所有进程的父进程”,即init进程,将成为新的PPID(父进程 ID)。 在某些情况下,这些进程称为孤儿进程。

当一个进程被杀死时,ps列表可能仍会显示该进程具有Z状态。 这是一个已死或已失效的进程。 该进程已死且未被使用。 这些进程不同于孤儿进程。 他们已经完成了执行,但仍然在进程表中找到了一个条目。

守护进程

守护进程是与系统相关的后台进程,通常在root权限下运行处理来自其他进程的请求。

守护进程没有控制终端。它无法打开/dev/tty。如果您执行ps -ef并查看tty字段,所有守护进程都会显示一个?

确切地说,守护进程是一个在后台运行的进程,通常等待它能够处理的事情发生。例如,等待打印命令的打印机守护进程。

如果您有一个需要长时间处理的程序,那么值得将其设为守护进程并在后台运行。

top命令

top命令是一个非常有用的工具,用于快速显示按各种标准排序的进程。

它是一种交互式诊断工具,经常更新并显示有关物理和虚拟内存、CPU使用率、平均负载和繁忙进程的信息。

这是运行top命令并查看不同进程的CPU利用率统计信息的简单语法

$top

作业ID与进程ID

后台和挂起的进程通常通过作业号(作业ID)进行操作。 该编号与进程ID 不同,使用它是因为它较短。

此外,一个作业可以由多个连续或同时、并行运行的进程组成。 使用作业ID比跟踪单个进程更容易。