2016-03-03 54 views
0

嗨我試圖檢查進程正在運行,如果是,請重新啓動它。但如果不是,請啓動它。該腳本在使用Plink從一臺Windows機器遠程執行了一批命令後運行。然後我運行另一個plink命令來運行此腳本。主機上的應用程序正在持續運行。重新啓動進程,如果它在Bash中運行

SERVICE="./Snowflake.app/Contents/MacOS/Snowflake" 

if pgrep "$SERVICE" >/dev/null 2>&1 ; 
then 
echo "$SERVICE is running" 
pkill "$SERVICE" 
else 
    /Applications/snowflake/run.sh 

fi 

這裏的問題是,如果應用程序打開,它不會關閉它,而是第二次打開該應用程序。任何人都可以告訴我哪裏出錯了?

回答

1

我建議簡單地,愚蠢地殺死進程並檢查錯誤消息,如No process found(在這種情況下這不是真的錯誤)。

每次試圖在殺死它之前檢查進程是否正在運行都將容易出現競爭狀態,這意味着進程可能在檢查之後立即啓動。

+0

對不起,沒有工作,仍然是相同的問題 – Eggfoot

+0

哦,對不起,我不得不第二次pkill,是的,你是對的,這是愚蠢的。 – Eggfoot

+0

其實它是*不傻*。它對於競爭條件是安全的。:) – hek2mgl

-1

問題是你已經把所有的輸出從pgrep發送到/ dev/null 讓這個簡單出來,它會工作。 (測試過!)

+0

重定向命令的輸出不會改變'$?'的值,這是'if'正在檢查的值。 – miken32

相關問題