进程组、会话和作业控制

在本章中,我们将熟悉进程组、会话和作业控制。

进程组 − 进程组是一个或多个进程的集合。进程组由一个或多个共享相同进程组标识符 (PGID) 的进程组成。进程组 ID (PGID) 与进程 ID 属于同一类型 (pid_t)。进程组有一个进程组负责人,即创建该组的进程,其进程 ID 将成为该组的进程组 ID。

会话 − 它是各种进程组的集合。

作业控制 − 这允许 shell 用户同时执行多个命令(或作业),一个在前台,其余都在后台。还可以将作业从前台移到后台,反之亦然。

让我们借助使用 shell (BASH) 的示例程序来理解这一点。

  • 用于执行基本命令 (date、echo、sleep 和 cal) 的 Shell 脚本 (BASH 中),名为 basic_commands.sh

  • 用于执行基本命令 (ps、echo) 的 Shell 脚本 (BASH 中)

#!/bin/bash
#basic_commands.sh

date
echo "Now sleeping for 250 seconds, so that testing job control functionality is smooth"
sleep 250
cal

#!/bin/bash
#process_status.sh

ps
echo "Now sleeping for 200 seconds, so that testing job control functionality is smooth"
sleep 200
ps

使用 chmod 命令为文件赋予执行权限。默认情况下,普通文件只具有读写权限,没有执行权限。

要停止当前正在运行的进程,您需要输入 CTRL+Z。这会为您提供一个作业编号。作业可以在前台或后台恢复。如果需要,要在前台恢复作业,请使用"fg"命令。如果需要,要在后台恢复作业,请使用"bg"命令。使用这个命令,它将只运行最后停止的进程。如果您想启动上次停止的进程以外的进程怎么办?只需在 fg 或 bg 后使用作业编号(例如 bg %2 或 bg %3 等)。如果正在运行的作业在后台,您可以在前台运行任何其他任务。要获取作业列表,请使用命令 jobs。也可以使用 CTRL+C 或 kill 命令终止进程。您可以在使用 kill 命令时传递作业编号。

检查以下输出,其中演示了停止作业、将作业从前台移到后台和反之亦然、终止作业等。

chmod u+x basic_commands.sh
chmod u+x process_status.sh

./basic_commands.sh
Wed Jul 5 18:30:27 IST 2017
Now sleeping for 250 seconds, so that testing job control functionality is smooth
^Z
[1]+ Stopped ./basic_commands.sh
./process_status.sh
PID   TTY   TIME     CMD
2295  pts/1 00:00:00 bash
4222  pts/1 00:00:00 basic_commands.
4224  pts/1 00:00:00 sleep
4225  pts/1 00:00:00 process_status.
4226  pts/1 00:00:00 ps
Now sleeping for 200 seconds, so that testing job control functionality is smooth
^Z
[2]+ Stopped      ./process_status.sh
jobs
[1]- Stopped      ./basic_commands.sh
[2]+ Stopped      ./process_status.sh
fg
./process_status.sh
^Z
[2]+ Stopped      ./process_status.sh
fg %2
./process_status.sh
^Z
[2]+ Stopped      ./process_status.sh
fg %1
./basic_commands.sh
^Z
[1]+ Stopped      ./basic_commands.sh

jobs
[1]+ Stopped      ./basic_commands.sh
[2]- Stopped      ./process_status.sh

bg %2
[2]- ./process_status.sh &
fg
./basic_commands.sh
^Z
[1]+ Stopped      ./basic_commands.sh
jobs
[1]+ Stopped      ./basic_commands.sh
[2]- Running      ./process_status.sh &
fg %2
./process_status.sh
^Z
[2]+ Stopped      ./process_status.sh
jobs
[1]- Stopped      ./basic_commands.sh
[2]+ Stopped      ./process_status.sh
kill %1 %2
[1]- Stopped      ./basic_commands.sh
[2]+ Stopped      ./process_status.sh

[1]- Terminated   ./basic_commands.sh
[2]+ Terminated   ./process_status.sh