在其他作业中引用Bash作业

时间:2013-08-06 16:13:54

标签: bash shell jobs job-control

我想在另一个后台Bash作业中引用后台Bash作业。这可能吗?

例如,假设我开始后台工作:

$ long_running_process &
[1] 12345

现在我想在工作完成时发生一些事情,所以我可以使用wait

$ wait %1 && thing_to_happen_after_long_running_process_finishes

然而,这将阻止,我希望我的终端回来做其他事情,但 Ctrl + Z 什么都不做。

首先尝试在后台启动它会失败:

$ { wait %1 && thing_to_happen_after_long_running_process_finishes; } &
[2] 12346
-bash: line 3: wait: %1: no such job
$ jobs
[1]-  Running     long_running_process &
[2]+  Exit 127    { wait %1 && thing_to_happen_after_long_running process_finishes; }

有没有办法在另一个后台工作中使用wait引用一个作业?

我使用GNU Bash 4.1.2(1)-release看到了这种行为。

2 个答案:

答案 0 :(得分:3)

一个shell只能在自己的孩子身上wait。由于后台作业创建了一个新shell,该shell中的wait只能等待它自己的子节点,而不是它的父节点的子节点(即后台等待分叉的shell)。根据您的需要,您需要提前计划:

long_running_process && thing_to_happen_after &

有一种选择:

long_running_process &
LRP_PID=$!

{ while kill -0 $LRP_PID 2> /dev/null; do sleep 1; done; thing_to_happen_after; } &

这将设置一个循环,尝试每秒ping一次后台进程。当该过程完成时,kill将失败,并继续进行后处理程序。它带有轻微的风险,您的流程将退出,另一个流程将在检查之间获得相同的流程ID,在这种情况下,kill会变得混乱并认为您的流程仍在运行,实际上它是新的。但风险非常小,实际上,如果thing_to_happen_after延迟一段时间,直到没有ID为$LRP_PID的流程,那么可能没问题。

答案 1 :(得分:0)

尝试这样的事情:

  x2=$(long_running_process && thing_to_happen_after_long_running_process_finishes ) &
相关问题