2017-10-21 83 views
1

我有10個指令並行執行:基於bash shell腳本中命令的退出狀態的回調?

comdA & comdB & comdC & comdD 

...

有如果這些命令返回0以外的退出狀態執行的回調的方式?

如果這是不可能的使用bash。如何PHP?我可以

function exec_with_callback ($comd) { 

    shell_exec($comd); 
    callback(); 

} 

exec_with_callback("comdA"); 
exec_with_callback("comdB"); 
... 
but in parallel? 

如果不是,我可以使用哪種其他語言?

+1

https://stackoverflow.com/questions/9258387/bash-ampersand-operator – chiliNUT

回答

1

可以在循環中執行你的命令,並保存使用$! shell變量,讓你最後的後臺作業的進程ID process_ids。

n=0 
commands=(comdA comdB comdC comdD) #storing all 10 commands in an array. store the status of each execution in another array 
for cmd in ${commands[@]}; do 
    ${cmd} & 
    pid=$! 
    pidarray[$n]=${pid} 
    ((n+=1)) 
done 

等待所有流程在循環中使用wait <PID>完成。

n=0 
for pid in ${pidarray[@]}; do 
    wait ${pid} 
    exit_status_array[$n]=$? 
    ((n+=1)) 
done 

現在循環遍歷exit_status_array和回調對應的命令,如果退出狀態比0

n=0 
for s in ${exit_status_array[@]}; do 
    if [[ ${s} -ne 0 ]]; then 
    commands[$n] & #callback 
    fi 
    ((n+=1)) 
done 

其他可以使用這個邏輯和調用等功能無限期如果你想重複這個過程,

0

也許你可以使用這個:

#!/bin/bash 

function check() { 
    $1 >/dev/null 2>&1 
    echo $? 
} 

command=("curl -sSL google.com" "echo 1" 'ping localhost -c 1' 'ls' 'false') 

for ((i=0;i<${#command[@]};i++)); do 
    echo "Command \"${command[$i]}\" returned value $(check "${command[$i]}")" 
    if (($(check "${command[$i]}") != 0)); then second=1; fi 
done 

if ((second == 1)); then 
    echo "I must run second group of commands because something have not worked!" 
    echo 2 
else 
    echo "All is gone without issues! Goodbye $USER!" 
    exit 0 
fi 

檢查函數運行命令並返回退出狀態,命令進入命令數組,使用for循環可以看到所有運行的命令及其退出狀態。如果某人的退出狀態不等於零,那麼當所有命令與其他命令完成時,變量會幫助我們運行一個if。

輸出

[email protected]:~/Scrivania$ bash example 
Command "curl -sSL google.com" returned value 0 
Command "echo 1" returned value 0 
Command "ping localhost -c 1" returned value 0 
Command "ls" returned value 0 
Command "false" returned value 1 
I must run second group of commands because something have not worked! 
2 
[email protected]:~/Scrivania$ bash example 
Command "curl -sSL google.com" returned value 0 
Command "echo 1" returned value 0 
Command "ping localhost -c 1" returned value 0 
Command "ls" returned value 0 
Command "true" returned value 0 
All is gone without issues! Goodbye darby! 
[email protected]:~/Scrivania$ 
0

的實施例準備由線含有一個命令文件myCommands

echo "curl -sSL google.com" > myCommands.txt 
echo "echo 1"    >> myCommands.txt 
echo "ping localhost -c 1" >> myCommands.txt 
echo "ls"     >> myCommands.txt 
echo "false"    >> myCommands.txt 

,然後使用xargs的,並檢查的xargs返回代碼。

xargs --arg-file myCommands.txt --max-procs 5 -I COMMAND sh -c "COMMAND" 
[ $? -eq 0 ] && echo "All command have sucessfully finish with retrun code 0" && echo "You need check the result" 

如果代碼返回等於0 ==>在myCommands文件中的所有命令已經成功,返回代碼完成0

--max-procs:運行到在時間MAX-特效過程;默認值爲1。如果 MAX-特效是0,xargs的將在同一時間運行多個程序儘可能 。

相關問題