2015-05-20 50 views
1

我有幾個程序需要以某種順序運行(p1然後p2然後p3然後p4)。 通常我只會做一個簡單的腳本或P1型& & P2 & & P3 & & P4。在Unix中連續運行程序

但是,這些程序不能正確退出。我只知道打印「成功」時它已成功完成。目前,只要我看到「成功」或「失敗」,我就會SIGINT,然後手動運行下一個程序,如果它是「成功」。

有沒有一種更簡單的方法來順序執行p1,p2,p3,p4而人工干預較少?

編輯:目前使用ksh,但我不介意也知道其他的。

+1

功能...什麼殼呢? – bishop

+0

目前使用ksh,但我不介意也知道其他的。 – Murdius

回答

0

我也是linux編程的新手,但是我發現了一些可能對您有用的東西。您是否嘗試過使用'wait'命令?

this answer上stackexchange:

sleep 1 & 
PID1=$! 
sleep 2 & 
PID2=$! 

wait $PID1 
echo PID1 has ended. 
wait 
echo All background processes have exited. 

我沒有測試它自己,但它看起來像你在你的問題中所述的內容。

1

在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

0

到目前爲止所有的答案都可以正常工作,如果你的程序真的會終止的話。 這裏有幾個想法,您可以通過文檔查看更多細節。

1st - 選項將修改您的程序,使其在打印結果消息後通過返回成功代碼而終止。

第二 - 如果不能使用分叉。

寫一個主要的地方,你每次想要執行一個程序時都要創建一個fork。

  • 在子進程中使用dup2將進程輸出到您選擇的文件中。

  • 主要保持檢查文件的內容,直到你得到的東西,並與成功或失敗進行比較。 - 將文件空白。

  • 然後您可以製作另一個叉並執行下一個程序。
  • 再次重複相同的操作。

請記住,execute是一個命令,它將使用作爲參數傳遞的文件的代碼替換其執行的進程的代碼,因此首先進行dup2調用。

0

當程序返回成功或失敗並繼續運行時,只要字符串通過,就應該將其終止。

做出這樣

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