1. 程式人生 > >shell小技巧--用“$$”和"$0"防止同一個指令碼啟動多次

shell小技巧--用“$$”和"$0"防止同一個指令碼啟動多次

    在編寫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