2013-05-08 37 views
1

我需要開發一個shell腳本,如果它們自己的另一個實例正在運行,它將不會啓動。bash腳本來監視我自己

如果我建立一個監測本身我需要知道,如果它已經在運行,然後中止,否則(如果以前沒有運行),一個test.sh我可以運行

#!/bin/bash 

loop() { 
    while [ 1 ]; do 
     echo "run"; 
     #-- (... omissis ...) 
     sleep 30 
     done 
} 

daemon="`/bin/basename $0`" 

pidlist=`/usr/bin/pgrep $daemon | grep -v $$` 
echo "1:[ $pidlist ]" 

pidlist=$(/usr/bin/pgrep $daemon | grep -v $$) 
echo "2:[ $pidlist ]" 

echo "3:[ `/usr/bin/pgrep $daemon | grep -v $$` ]" 

echo "4:[" 
/usr/bin/pgrep $daemon | grep -v $$ 
echo "]" 

if [ -z "$pidlist" ]; then 
     loop & 
else 
     echo "Process $daemon is already running with pid [ $pidlist ]" 
fi 

exit 0; 

當我運行上面腳本的第一次(之前沒有正在運行的實例)我得到這樣的輸出:

1:[ 20341 ] 
2:[ 20344 ] 
3:[ 20347 ] 
4:[ 
] 

我不明白爲什麼只有四嘗試不返回任何東西(如預期)。我的腳本有什麼問題? 我是否必須在臨時文件上重定向第四個命令的輸出,然後查詢該文件以決定是否可以運行(或不運行)循環函數?

謝謝任何​​人會幫助我!

+0

你在哪個平臺上?如果是Ubuntu或Debian,請嘗試使用'start-stop-daemon'。如果是其他Linux,請嘗試從Debian/Ubuntu複製該程序。 – 2013-05-08 12:56:55

+0

另請參閱:http://stackoverflow.com/questions/2530114/bash-continue-script-if-only-one-instance-is-running – moonshadow 2013-05-08 13:00:09

+0

平臺是RedHat 2.6。 /usr/bin/pidof沒有安裝我既不能安裝它 – 2013-05-08 13:40:36

回答

0

子殼...前三個子殼運行,因此$$已更改爲子殼的PID。

嘗試使用:

PID=$$ 
pidlist=`/usr/bin/pgrep $daemon | grep -v $PID` 
echo "1:[ $pidlist ]" 

等。由於的$PID值子shell運行前成立,這應該是所有的命令一樣。

這個過程是否足夠流行,其他人希望在機器上運行相同的守護進程?也許你在機器上永遠不會有多個用戶,但請記住其他人也可能想要運行該命令。