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