Linux 进程管理

在Linux系统上执行一个程序时,系统会为该程序创建一个特殊的环境。这个环境包含了系统运行程序所需要的一切,就好像系统上没有其他程序在运行一样。每当在Linux中发出一个命令时,它都会创建或启动一个新进程。当尝试使用ls命令列出目录内容时,就启动了一个进程。简单地说,进程就是一个正在运行的程序的实例。操作系统通过一个叫做pid或进程ID的五位数ID号来跟踪进程。系统中的每个进程都有一个唯一的pid。pid最终重复,因为所有可能的数字都用完,下一个pid继续或重新开始。在任何时候,系统中都不存在两个pid相同的进程,因为Linux用它来跟踪每个进程。

1、启动Process

当启动一个进程(运行一个命令),有两种方式可以运行它:

  • 前台进程(Foreground Processes)
  • 后台进程(Background Processes)

1)前台进程

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

可以通过ls命令看到这种情况。如果希望列出当前目录中的所有文件,可以使用以下命令:

$ ls cjavapy*.doc

显示所有文件,文件名以ch开头,以.doc结尾:

cjavapy01-1.doc   cjavapy010.doc  cjavapy02.doc    cjavapy03-2.doc 
cjavapy04-1.doc cjavapy040.doc cjavapy05.doc

进程在前台运行,输出直接指向我的屏幕,如果ls命令需要任何输入(不需要),会从键盘等待它。

当一个程序在前台运行并且非常耗时时,不能运行其他命令(启动任何其他进程),因为提示符在程序完成处理并输出之前是不可用的。

2)后台进程

一个后台进程在不连接键盘的情况下运行。如果后台进程需要任何键盘输入,它就会等待。

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

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

例如,

$ ls cjavapy*.doc &

将显示所有名称以cjavapy开头、以.doc结尾的文件:

cjavapy01-1.doc   cjavapy010.doc  cjavapy02.doc    cjavapy03-2.doc 
cjavapy04-1.doc cjavapy040.doc cjavapy05.doc

如果ls命令需要任何输入(不需要),将进入停止状态,直到我们将它移到前台并从键盘上给它数据。

第一行包含关于后台进程的信息——作业号和进程ID。需要知道作业号,以便在后台和前台之间操作它。

按下Enter键,将看到以下内容:

[1]   +   Done                 ls cjavapy*.doc &

上面信息说明ls命令后台进程已成功完成。

2、查看正在运行的进程

通过运行ps(进程状态)命令可以很容易地看到自己的进程,如下所示,

$ ps
PID TTY TIME CMD
538 ttys000 0:00.13 -bash
19799 ttys000 0:00.07 ssh root@192.168.31.11
982 ttys001 0:00.08 -bash
1061 ttys002 0:00.75 -bash
1128 ttys003 0:00.05 -bash

ps最常用的标志之一是-f (f代表full)选项,它提供了更多信息,如下:

$ ps -f
UID PID PPID C STIME TTY TIME CMD
501 538 535 0 25 821 ttys000 0:00.13 -bash
501 19799 538 002下午 ttys000 0:00.07 ssh root@192.168.31.11
501 982 980 0 25 821 ttys001 0:00.08 -bash
501 1061 1060 0 25 821 ttys002 0:00.75 -bash
501 1128 1106 0 25 821 ttys003 0:00.05 -bash

ps -f命令显示的所有字段的说明,如下表,

列名

说明

UID

该进程所属的用户ID(运行它的人)

PID

Process ID(进程ID)

PPID


Parent process ID (父进程ID,启动它的进程的ID)

C


进程的CPU利用率

STIME


Process 开始时间

TTY


与进程关联的终端类型

TIME


进程占用的CPU时间

CMD

启动此进程的命令

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

选项

说明

-a

显示所有用户信息

-x

显示没有终端的进程的信息

-u

显示附加信息,如-f选项

-e

显示额外扩展信息

2、停止进程

结束一个过程有几种不同的方法。通常,在基于控制台的命令中,发送CTRL + C键(默认中断字符)将退出命令。当进程以前台模式运行时,此操作有效。如果一个进程正在后台运行,应该使用ps命令获取它的PID。之后,可以使用kill命令终止进程,如下所示,

$ ps -f
UID PID PPID C STIME TTY TIME CMD
501 538 535 0 25 821 ttys000 0:00.13 -bash
501 19799 538 002下午 ttys000 0:00.07 ssh root@192.168.31.11
501 982 980 0 25 821 ttys001 0:00.08 -bash
501 1061 1060 0 25 821 ttys002 0:00.75 -bash
501 1128 1106 0 25 821 ttys003 0:00.05 -bash$kill 1128 Terminated

kill命令终止bash进程。如果进程忽略常规的kill命令,可以使用kill -9加上PID(进程号),如下所示,

$ kill -9 1128
Terminated

3、父进程和子进程

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

运行的大多数命令都将shell作为它们的父命令。运行ps -f示例,其中该命令同时列出了进程ID和父进程ID。

4、僵尸进程和孤儿进程(Zombie 和 Orphan Process)

通常,当子进程被终止时,父进程会通过SIGCHLD信号更新。然后,父节点可以根据需要执行其他任务或重新启动新的子节点。但是,有时父进程会在子进程结束之前结束。在这种情况下,所有进程的父进程,也就是init进程,将成为新的PPID(父进程ID)。在某些情况下,这些进程被称为孤儿进程。

当一个进程被终止时,ps列表仍然可以显示具有Z状态的进程。这是一个僵尸进程。该进程已死且未被使用。这些过程不同于孤儿过程。它们已经完成了执行,但仍然在进程表中找到一个条目。

4、守护进程(Daemon Process)

守护进程是与系统相关的后台进程,通常以root和来自其他进程的服务请求的权限运行。

守护进程没有控制终端。无法打开/dev/tty如果执行一个"ps -ef"并查看tty字段,那么所有守护进程都将具有一个?。

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

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

5、top 命令

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

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

运行top命令和查看不同进程的CPU利用率统计信息,使用简单语法如下,

$ top

6、Job ID与Process ID

后台进程和挂起进程通常通过作业号(Job ID)进行操作。这个数字与Process ID不同,使用它是因为它更短。

此外,一个作业可以由多个进程组成,这些进程可以串联运行,也可以同时并行运行。使用Job ID比跟踪单个进程更容易。

推荐阅读
cjavapy编程之路首页