2016-01-24 151 views
1

我有一個shell腳本,我需要經常啓動。我可以設置啓動快捷方式(我用它來啓動),但不能終止。我需要Ctrl + C來終止它。結果有時最終會打開許多​​流程。殺死舊的(如果存在)啓動新進程

所以我想要做的是在腳本中添加一些命令,檢查腳本中是否存在較舊的進程並殺死它然後啓動新的進程。

只是爲了讓我的要求更加明確,我嘗試以下

說行書是/home/user/runscript.sh
ps aux | grep runscript.sh給我

user+ 6135 0.0 0.0 16620 1492 ?  S 18:28 0:00 /home/user/runscript.sh 
user+ 6208 0.0 0.0 15936 952 pts/6 R+ 18:28 0:00 grep --color=auto runscript.sh 

我在前面加上劇本

pkill -f runscript.sh 

下殺過程中,如果它已經在運行。它解決了殺死舊流程的目的,但沒有讓新流程開始。原因很明顯,後來我明白了。

這樣做的正確方法是什麼?

回答

7

的典型方法這是使用基於文件系統的鎖定策略:

的腳本創建一個鎖定文件(/var/lock/subsystem/...)有自己的進程號爲內容。啓動時,它第一個檢查這個文件是否已經存在。如果不是,一切都好。但如果是這樣,那麼它會從文件中讀取進程號並使用它來檢查進程表。如果這樣的過程仍然存在,那麼它可以退出(通常的行爲),或者可以通過發送SIG-TERM信號來終止該過程(你要求的)。

+0

感謝您的詳細解釋。我可以想到這樣的行爲,但想知道是否存在可以做到這一點的一些命令或單行命令組合。 –

+0

這確實是要走的路。我建議你進一步閱讀[ProcessManagement](http://mywiki.wooledge.org/ProcessManagement) –

2

您可以改爲使用killall。麻煩的是,你想避免殺死你的當前進程,但是這很容易與-o標誌位來完成:

-o,--older高於

僅匹配是老年人(開始前)的過程指定的時間爲 。時間被指定爲浮動然後是單位。 單位分別是s,m,h,d,w,M,y,分別爲秒,分鐘,小時,天, 周,月和年。

因此,這應該工作:

killall -o 5s runscript.sh 

對方回答是從根本上更好,因爲它是彈性的「專業」的做法,但如果只是爲了自己的腳本這個方法應該工作,你想採取簡單的方法。

+0

這可以基於PID來完成嗎?最好使其與時間無關。儘管您的解決方案足以滿足我的要求。 –

+0

這裏的一個問題是,您需要確切地知道_how_進程已啓動,因爲'killall'工作名稱(路徑)基於。 – arkascha

+0

該進程始終直接使用該命令啓動。 –