2013-01-04 30 views
0

在shell腳本中,我試圖等待非子進程。我如何從做參考: WAIT for "any process" to finishShell:非子進程的返回值

我的shell腳本的結構是:

Main.sh

func1(){ 
return 1 
} 

func2(){ 
# Wait for func1 to finish 
while kill -0 "$pid_func1"; do 
     sleep 0.5 
done 
} 
# Call function 1 in background 
func1 & 
pid_func1=$! 
func2 & 

在這種情況下,我怎麼收到內部功能FUNC1的返回值FUNC2?

+0

只是爲了澄清,這個例子是問'如何等待子進程',但問題的標題問如何獲得非子進程的返回值。什麼是實際問題?如果你問我能否從非子進程獲得返回碼,那麼它通常不可用 – Petesh

回答

2

您通常無法捕獲非子進程的退出狀態。你可能能夠工作,包括將退出代碼記錄到狀態文件然後讀取值,否則你將無法捕獲值

+0

我也在後臺調用func2。我得到錯誤「pid不是這個shell的孩子」。 – user613114

+0

在這種情況下它不會起作用 - 您不能等待不是當前shell的子項的作業 – Petesh

0

我使用了另一個shell變量來將返回狀態存儲在這種情況下,檢查這個shell變量的值是否需要。在下面找到一個示例shell腳本來模擬場景。

#!/bin/bash 

func1(){ 
retvalue=23 # return value which needs to be returned 
status_func1=$retvalue # store this value in shell variable 
echo "func1 executing" 
return $retvalue 
} 



func2(){ 
# Not possible to use wait command for pid of func1 as it is not a child of func2 
#wait $pid_func1 
#ret_func1=$? 

while kill -0 "$pid_func1"; do 
     echo "func1 is still executing" 
     sleep 0.5 
done 

echo "func2 executing" 

#echo "func1 ret: $ret_func1" 
echo "func1 ret: $status_func1" 
} 

# Main shell script starts here 

func1 & 
pid_func1=$! 

func2 & 

希望它對其他面臨同樣問題的人有用。