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 命令
使用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 和 Suspend
当作业正在运行时,您可以执行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
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