我想在另一个后台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看到了这种行为。
答案 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 ) &