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

相关内容