在编写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
版权声明:声明:本文档可以转载,须署名原作者。 作者:无为 qq:490073687
shell小技巧--用“$$”和"$0"防止同一个脚本启动多次
原文地址:http://blog.csdn.net/rookie_ceo/article/details/47209843