9. jobs 命令选项


使用jobs -l显示 PID 以及作业 ID。

$ jobs -l
[1]   6580 Done                       ./jobs.sh
[2]-  6625 Running                    ./jobs1.sh &
[3]+  6688 Running                    ./jobs2.sh &

仅显示特定作业的状态。

$ jobs -l 3
[3]+  6688 Running                    ./jobs2.sh &

当您运行多个作业时,如果您只想了解自上次通知用户以来发生更改的作业的状态,请执行以下操作。

$ jobs -n
[1]   6580 Done                       ./jobs.sh

仅显示所有后台作业的 PID。

$ jobs -p
6625
6688

将包含字母 "j" 的作业带到前台:

$ %?j
./jobs.sh

将以字符串 "./j" 开头的作业带到前台

$ %./j
./jobs.sh

$! 包含最后一个后台作业的 PID。

$ echo $!
6922

下表列出了可用于引用后台作业的各种作业字符串。

job string 描述
%n 指向第 n 个后台作业
%%, $+,% 指向当前的后台作业
%- 指向前一个后台作业
%string 指向以指定字符串开头的作业
%?string 表示包含指定字符串的作业

使用disown命令,您可以指示 bash 拒绝特定作业。

当一个作业被 bash shell 拒绝时,它会从 bash 维护的后台作业表中删除,这样它就不会被jobs命令显示,但该作业仍在运行。可以使用ps命令查看。

在以下示例中,后台作业正在运行。

$ jobs
[1]+  Running                        ./jobs.sh &

现在,指示 bash shell 拒绝此后台作业。

$ disown %1

执行disown后,该作业不会显示在 jobs 命令输出中。

$ jobs
$ jobs -l

但是,当您执行ps -ef来显示所有进程时,您将看到该作业仍在后台运行。

$ ps -ef | grep 6922
ramesh   6922  6513  0 08:11 00:00:00 bash
ramesh   6998  6922  0 08:16 00:00:00 ./jobs.sh
ramesh   7000  6513  0 08:16 00:00:00 grep -i 6922

当作业正在运行时,您可以执行wait命令来指示 bash 等待,直到所有作业都终止。

在此示例中,正在运行以下 3 个作业。

$ jobs -l
[1]   6580 Done                       ./jobs.sh
[2]-  6625 Running                    ./jobs1.sh &
[3]+  6688 Running                    ./jobs2.sh &

不带任何参数的wait命令将等待该会话拥有的所有作业完成。

wait

您还可以传递 PID 或作业号来指示 bash shell 等待特定作业。 以下示例等待作业 #2 完成。

wait %2
(or)
wait 6625

注意:您还可以在 shell 脚本中使用wait命令,这将推迟 shell 脚本继续运行,直到所有后台作业完成。

suspend命令挂起当前 bash shell 的执行并等待SIGCONT信号。您无法暂停登录 shell:

$ suspend
-bash: suspend: cannot suspend a login shell

让我们创建一个新的 bash shell, 然后挂起它:

$ bash
$ suspend
[1]+  Stopped                          bash

我们刚刚使用bash命令创建的 bash shell 现在已暂停(即已停止)。要将其置于前台,请执行以下操作。

$ fg
bash