2013-08-06 39 views
1

我想在另一個背景中引用背景Bash工作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) - 發佈。

回答

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的進程,它可能會好起來。

+0

認爲可能是這種情況。該死的。 –

0

嘗試這樣的事:

x2=$(long_running_process && thing_to_happen_after_long_running_process_finishes) & 
相關問題