跳转到内容

Unix/作业控制快速入门

来自维基教科书,开放世界中的开放书籍


控制 Unix 中的作业

[编辑 | 编辑源代码]

Unix 中的进程 - 也就是正在执行特定任务的程序 - 可以运行在前台后台。前台作业会在当前 shell 中显示,并且您无法与 shell 交互,直到作业完成或被中断。后台作业启动后会立即返回到提示符,您可以在后台进程继续运行的同时输入更多命令。后台作业可以写入当前终端窗口。

作业默认情况下会运行在前台。

后台作业

[编辑 | 编辑源代码]

您可以选择在后台启动作业,或者在作业启动后将其发送到后台。

在后台启动作业

[编辑 | 编辑源代码]

在启动作业的命令末尾追加&。例如,我们可以使用 GNU C 编译器在后台编译程序 hello,如下所示

% gcc hello.c -o hello &

将已启动的作业移到后台

[编辑 | 编辑源代码]

如果您在前台启动了作业,可以将其移到后台。首先,使用 Ctrl+Z 停止作业,然后使用bg命令将停止的作业发送到后台。例如,我们可以启动 web 浏览器 Lynx,停止它,并将其发送到后台,如下所示

%lynx
^z
%bg

使用 Ctrl+Z 停止的作业被传递到后台并继续运行。

将作业移到前台

[编辑 | 编辑源代码]

您可以使用fg命令将作业调回前台。单独使用它将调回最近在后台启动的作业。如果我们刚刚将 lynx 发送到后台,如上所示,那么

% fg

将把作业移到前台。

哪些作业正在运行?

[编辑 | 编辑源代码]

可以使用以下两个命令之一来查找哪些作业正在后台运行。

jobs命令在许多 shell 中可用,并报告正在运行的作业、作业编号、进程名称(如果您希望使用-l选项查看进程组 ID)。您可以像这样使用它

%jobs

.

在输出中,方括号('[' 和 ']')中的数字是作业编号,这些编号由fgbg等进程控制命令使用。

ps命令将打印有关当前运行的进程的信息。实际上,它比这要复杂一些。该命令打印有关当前终端和当前有效用户 ID 控制的进程的信息。某些命令需要用于控制进程的进程标识号,在这种情况下,该信息将出现在输出的第一列中。

%ps

使用作业编号

[编辑 | 编辑源代码]

现在您可以使用 jobs 或 ps 识别作业编号,可以使用它们来控制作业。如果您在后台运行了多个作业,可以通过使用作业编号选择一个作业并将其调回前台。您可以通过添加作业编号来使用fg命令,而不是直接使用fg命令,例如

%fg 2

这将把编号为 2 的作业(由jobs标识)调回前台。

杀死作业

[编辑 | 编辑源代码]

您可以通过不同的方式终止 Unix 作业。一种简单的方法是将作业调回前台并终止它,例如使用 Ctrl+C。

Unix 命令kill可用于终止后台进程。您可以使用作业编号(在前面加上 %)或进程标识号 (PID) 作为kill命令的参数。一个常见的误解是需要使用 -9(SIGKILL 信号)来终止进程。这是一个不好的做法,因为 SIGKILL 信号不允许进程正常终止,而是会立即终止它。这会导致内存管理问题。正确终止进程的方式是使用 -2(SIGINT)信号,它允许进程执行清理工作

%kill -2 %2

%2 指定了进程的 PID。要使用作业编号杀死作业,请省略百分号

%kill -2 1367

如果 -2 信号不起作用,该进程可能被阻塞或执行不正常。在这种情况下,请使用 -1(SIGHUP)、-15(SIGTERM),最后再尝试使用 -9(SIGKILL)。

华夏公益教科书