2017-02-22 47 views
5

在我的腳本中,我設置了set -e以在發生錯誤時停止處理。它適用於在前臺運行的所有命令,但我的一些命令必須在後臺並行運行。 不幸的是,如果後臺進程失敗,腳本不會停止,儘管set -e標誌。設置-e和後臺進程

前景處理工程的示例。

#!/bin/bash 
set -e 
ls -l no_file 
sleep 100 

後臺進程的示例不起作用。

#!/bin/bash 
set -e 
ls -l no_file & 
sleep 100 

如何處理後臺進程的失敗?

回答

5

異步啓動命令(使用&)總是返回退出狀態0.要獲取命令的實際退出狀態,請使用內建的wait。一個簡單的例子:

$ (sleep 5; ls -l nofile) & 
[1] 3831 
$ echo $? 
0 
$ wait -n 
ls: cannot access 'nofile': No such file or directory 
[1]+ Exit 2     (sleep 5; ls --color=auto -l nofile) 
$ echo $? 
2 

wait -n等待任何子進程(其可以是非常有用的)。如果你想等待一個特定的進程,你可以捕捉到PID當您啓動 - 這是在特殊的變量$! - 然後通過PID等待:

$ (sleep 5; ls -l nofile) & 
$ myjobpid=$! 
$ # do some other stuff in parallel 
$ wait ${myjobpid} 
ls: cannot access 'nofile': No such file or directory 
[1]+ Exit 2     (sleep 5; ls --color=auto -l nofile) 

Bash的手冊中的相關章節的標題「作業控制」

+0

等待PID的解決方案完全是我正在尋找的。謝謝。 – Marcin