2012-09-25 177 views
-1

我需要一些幫助。我有一個腳本'腳本1',它將調用'腳本2'在後臺運行,並定期檢查某些內容。但我希望腳本2只開始一次,即使腳本1被多次調用。有沒有辦法做到這一點?從腳本中只運行一次命令,甚至腳本多次執行

如果有人提出一些命令來實現這一點,那將會更有幫助。

在此先感謝

+0

[Shell腳本的可能的重複:確保腳本不執行,如果已經運行](http://stackoverflow.com/questions/4768860/shell-script-ensure-that-script-isnt-executed-if-已經運行) –

+0

重複的:http://stackoverflow.com/questions/185451/quick-and-dirty-way-to-ensure-only-one-instance-of-a-shell-script-is-running-在 –

回答

1

當然,你可以把這樣的事情在Script2頂部:

if [[ -f /tmp/Script2HasRun ]] ; then 
    exit 
fi 
touch /tmp/Script2HasRun 

這將阻止Script2曾經使用定點文件,除非重新運行文件被刪除,當然,它可能會在某個時間點,因爲它在/tmp

所以你可能想把它放在其他地方,它可以得到更好的保護。

如果你不要想要阻止它再次運行,你需要一些機制來刪除sentinel文件。

例如,如果你的目的是隻有一個副本同時運行:

if [[ -f /tmp/Script2IsRunning ]] ; then 
    exit 
fi 
touch /tmp/Script2IsRunning 
# Do whatever you have to do. 
rm -f /tmp/Script2IsRunning 

而且記住有這麼可以結果一分式兩份運行中存在的競爭條件。有一些方法可以減輕以及通過使用內容以及存在的,是這樣的:

if [[ -f /tmp/Script2IsRunning ]] ; then 
    exit 
fi 
echo $$ >/tmp/Script2IsRunning 
sleep 1 
if [[ "$(cat /tmp/Script2IsRunning 2>/dev/null)" != $$ ]] ; then 
    exit 
fi 
# Do whatever you have to do. 
rm -f /tmp/Script2IsRunning 

有超出保護更多的水平,但他們變得複雜,我常常發現,足以滿足大多數事情。

+0

非常感謝paxdiablo。這個答案非常有用,它解決了我的問題。 :) – iMSivam