码迷,mamicode.com
首页 > 系统相关 > 详细

shell小技巧--用“$$”和"$0"防止同一个脚本启动多次

时间:2015-08-02 20:04:20      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:shell   linux   

    在编写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"防止同一个脚本启动多次

标签:shell   linux   

原文地址:http://blog.csdn.net/rookie_ceo/article/details/47209843

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!