我有幾個程序需要以某種順序運行(p1然後p2然後p3然後p4)。 通常我只會做一個簡單的腳本或P1型& & P2 & & P3 & & P4。在Unix中連續運行程序
但是,這些程序不能正確退出。我只知道打印「成功」時它已成功完成。目前,只要我看到「成功」或「失敗」,我就會SIGINT,然後手動運行下一個程序,如果它是「成功」。
有沒有一種更簡單的方法來順序執行p1,p2,p3,p4而人工干預較少?
編輯:目前使用ksh,但我不介意也知道其他的。
我有幾個程序需要以某種順序運行(p1然後p2然後p3然後p4)。 通常我只會做一個簡單的腳本或P1型& & P2 & & P3 & & P4。在Unix中連續運行程序
但是,這些程序不能正確退出。我只知道打印「成功」時它已成功完成。目前,只要我看到「成功」或「失敗」,我就會SIGINT,然後手動運行下一個程序,如果它是「成功」。
有沒有一種更簡單的方法來順序執行p1,p2,p3,p4而人工干預較少?
編輯:目前使用ksh,但我不介意也知道其他的。
我也是linux編程的新手,但是我發現了一些可能對您有用的東西。您是否嘗試過使用'wait'命令?
從this answer上stackexchange:
sleep 1 &
PID1=$!
sleep 2 &
PID2=$!
wait $PID1
echo PID1 has ended.
wait
echo All background processes have exited.
我沒有測試它自己,但它看起來像你在你的問題中所述的內容。
在bash中,你可以通過命令grep尋找'Success',然後依靠grep的結果代碼。這個技巧是用花括號將整個表達式包裝成一個內聯子shell。像這樣:
$ cat foo.sh
#!/bin/bash
[ 0 -eq $(($RANDOM %2)) ] && echo 'Success' || echo 'Failure'
exit 0
$ { ./foo.sh | grep -q 'Success'; } && ls || df
的部分大括號內({}
)返回0,如果「成功」是在輸出中,否則爲1,彷彿foo.sh命令已經如此本身完成。 More details on that technique.
我很久沒有使用ksh了,但我懷疑有一個similar construction。
到目前爲止所有的答案都可以正常工作,如果你的程序真的會終止的話。 這裏有幾個想法,您可以通過文檔查看更多細節。
1st - 選項將修改您的程序,使其在打印結果消息後通過返回成功代碼而終止。
第二 - 如果不能使用分叉。
寫一個主要的地方,你每次想要執行一個程序時都要創建一個fork。
在子進程中使用dup2將進程輸出到您選擇的文件中。
主要保持檢查文件的內容,直到你得到的東西,並與成功或失敗進行比較。 - 將文件空白。
請記住,execute是一個命令,它將使用作爲參數傳遞的文件的代碼替換其執行的進程的代碼,因此首先進行dup2調用。
當程序返回成功或失敗並繼續運行時,只要字符串通過,就應該將其終止。
做出這樣
function startp {
prog=$1
./${prog} | while read -r line; do
case "${line}" in
"Success")
echo OK
mykill $prog
exit 0
;;
"Fail")
echo NOK
mykill $prog
exit 1
;;
*) echo "${line}"
;;
esac
done
exit 2
}
功能,您需要添加一個邁基爾功能,看起來對PX項目,並殺死它(xargs的是好的吧)。
呼叫像
startp p1 && startp p2 && startp p3
功能...什麼殼呢? – bishop
目前使用ksh,但我不介意也知道其他的。 – Murdius