2014-04-09 143 views
3

具有低於示例腳本sample.sh如何從腳本本身檢查腳本是否正在運行?

#!/bin/bash 

if ps aux | grep -o "sample.sh" >/dev/null 
then 
    echo "Already script running" 
    exit 0 
fi 

echo "start script" 

while true 
do 
    echo "script running" 
    sleep 5 
done 

在上面的腳本中,我要檢查,如果該腳本之前運行或不運行,如果沒有,然後再運行它。

問題是檢查條件總是成真(因爲檢查條件需要運行腳本),它總是顯示我"Already script running"消息。

任何想法如何解決它?

回答

7

您需要一個正確的鎖。我願意做用flock這樣的:

exec 201> /tmp/lock.$(basename $0).file 
if ! flock -n 201 ; then 
    echo "another instance of $0 is running"; 
    exit 1 
fi 

# cmds 

exec 201>&- 
rm -rf /tmp/lock.$(basename $0).file 

這基本上創建了使用臨​​時文件腳本鎖。臨時文件除了用於告訴您的腳本是否獲得鎖定之外,具有特別的意義。 當運行此程序的一個實例時,同一程序的下一次運行無法運行,因爲鎖會阻止它。

+0

我相信鎖定文件不應該被刪除。無需刪除它,如果刪除它,則存在在被鎖定時刪除它的風險,這會中斷該鎖(因爲鎖仍然存在,但文件將會更改)。 –

+0

在程序中刪除它是無害的,因爲一旦程序退出,鎖將自動釋放。我傾向於刪除我創建的臨時工。 –

+0

但它顯示錯誤像'./sample.sh:第3行:/tmp/lock../sample.sh.file:沒有這樣的文件或目錄 flock:201:錯誤的文件描述符' –

0

試試這個,它給用戶

ps -aux | awk -v app='sample.sh' '$0 ~ app { print $1 }' |grep $USERNAME|wc -l 
1

運行對我來說將是更安全的使用鎖文件,創建它的過程開始和完成後刪除sample.sh的數量。

1

讓腳本在文件中記錄自己的PID。在這之前,它首先檢查該文件當前是否包含活動的PID,在這種情況下它將退出。

pid=$(< ${PID_FILE:?} || exit 
kill -0 $PID && exit 

下一個練習是爲了防止競爭條件時寫作文件。

0

將tmp文件寫入/ tmp目錄。 有你的腳本檢查,看看文件是否存在,如果它確實沒有運行。

#!/bin/sh 

# our tmpfile 
tmpfile="/tmp/mytmpfile" 

# check to see if it exists. 
# if it does then exit script 
if [[ -f ${tmpfile} ]]; then 
echo script already running. 
exit 
fi 

# it doesn't exist at this point so lets make one 
touch ${tmpfile} 

# do whatever now. 

# end of script 
rm ${tmpfile} 
+0

如果我的劇本意外死亡會怎麼樣?所以它不會去除tempfile。 –

+0

您可以在文件名中包含PID名稱,也可以將其寫入臨時文件中。在進程崩潰的情況下,新進程將具有不同的PID。 – Vaibhav

相關問題