2014-03-24 48 views
1

好吧,所以我有一个包含检查postgres数据库的无限循环的脚本。这工作正常。为了确保进程继续运行,我正在使用cron继续每minuet执行文件。要停止多个实例,我写了这个PID检查脚本。当通过crontab运行时,PID检查器将不起作用

SCRIPTNAME=`basename $0` 
PIDFILE="/var/run/${SCRIPTNAME}.pid" 

if [ -e ${PIDFILE} ]; then 
    PID=`cat ${PIDFILE}`; 

    echo "Found PID ${PID}" 

    RUNNING=`ps -p ${PID} -o pid=` 
    if [ ${RUNNING} -eq ${PID} ]; then 
     RUNNINGNAME=`ps -p ${PID} -o command=` 
     if [ `echo "${RUNNINGNAME}" | grep -c *${SCRIPTNAME}*` -eq "1" ]; then 
      echo "${SCRIPTNAME} is already running." 
      exit 1 
     else 
      echo "Wrong PID file." 
     fi 
    else 
     echo "Outdated PID file." 
    fi 
else 
    echo "No PID file." 
fi 
echo $$ > ${PIDFILE} 

当我运行过程中与./script.sh它不会让我在不同的命令行运行另一个实例。但问题是,当我在cron中初始化它时,它会创建多个实例,看起来不考虑我的pid检查。任何帮助将非常感激。

+0

您是否确定cron执行的环境具有适当的'PATH'变量来查找cat/echo/ps/grep?你的脚本开头是否有'#!/ bin/bash',以便你确定它正在通过正确的解释器运行? – Sammitch

+0

+1,第一个问题很好。如何用'set -vx'打开调试/跟踪,然后像'59 23 24 03 * /path/to/MyProg.sh> /tmp/myProg.Trace 2>&1'那样重定向crontab cmd行上的所有输出?祝你好运 – shellter

+0

感谢您的帮助,我解决了它。我最终摆脱了if语句'if [echo“$ {RUNNINGNAME}”| grep -c * $ {SCRIPTNAME} * -eq“1”];那么 echo“$ {SCRIPTNAME}已经在运行。” 退出1'并且刚刚告诉它退出1,如果存储的pid与正在运行的pid匹配。对不起,我浪费了你的时间。 – user3457244

回答

0

通过简单地移除代码

if [ echo "${RUNNINGNAME}" | grep -c *${SCRIPTNAME}* -eq "1" ]; then
echo "${SCRIPTNAME} is already running." exit 1 fi

的部分,并用简单的exit 1我能得到它的工作取代它。

由于某些原因,cron不喜欢这部分脚本。当手动运行它时,最好保留它,这将有助于脚本实际上是在存储的pid下运行的脚本。这是一个小的机会,通常只会由于用户错误而发生,但为此构建可能性是一个好主意。

我仍然不确定为什么这在cron中打破,但确实如此。

相关问题