shell小技巧--用“$$”和"$0"防止同一個指令碼啟動多次
阿新 • • 發佈:2019-02-16
在編寫shell指令碼通過crontab定時任務啟動時,如果shell指令碼執行時間超過了,crontab拉起指令碼的時間間隔,這個時候可能就會出現同一個指令碼同時啟動多次的現象。這個時候可能會導致採集的資料有重複,計算不準確等等問題,在這種有明顯先和順序要求的時候,就會出問題。
需要採取一定手段,防止這種現象。剛好可以用“$$”和"$0",來實現這個需求,實現只有等當前指令碼執行完成之後,才能啟動第二次執行。好了,廢話不多說,直接貼一個demo,只要稍加改動,就可以套用到自己的程式裡面。同樣稍加變通,就可以實現守護程序的效果。
$0 當前程式名 $n 當前程式的引數(從1開始,空格分隔) $* 當前程式的所有引數 $# 當前程式的引數個數 $$ 當前程式的PID(指令碼執行的當前程序ID號) $? 執行上一個指令的返回值 (顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤)
第一次執行
#sh ponlyone.sh &
[1] 30538
#
pid=30538 pname=ponlyone.sh
expid=30452
$$==30538
$0==ponlyone.sh
$?==0
$#==1
$1==111
$2==
$\!==
第二次執行
#sh ponlyone.sh & [2] 30570 # pid=30570 pname=ponlyone.sh expid=30538 The process ponlyone.sh is already exists ! pid:30538 [2]+ Done sh ponlyone.sh
#!/bin/sh source /etc/profile pid=`echo $$` pname=`echo $0` mypidfile=~/pid.test echo -e "\n pid=$pid pname=$pname \n" function dodo(){ echo "\$\$=="$$ echo "\$0=="$0 echo "\$?=="$? echo "\$#=="$# echo "\$1=="$1 echo "\$2=="$2 echo "\$\!=="$! sleep 100 } if test -f "$mypidfile" then expid=`cat $mypidfile` echo "expid=$expid" pfalg=`ps -ef|grep "$expid"|grep "$pname"|wc -l` if [ "1" = "$pfalg" ] then echo "The process $pname is already exists ! pid:$expid" else echo $pid > $mypidfile dodo 111 fi else echo $pid > $mypidfile dodo 100 fi