通过crontab运行时,PID检查器不起作用

时间:2014-03-24 21:09:58

标签: bash postgresql cron crontab pid

好的,所以我有一个脚本,其中包含一个检查postgres数据库的无限循环。这很好。为了确保进程将继续运行,我使用cron继续执行每个小步骤的文件。为了停止这个实例,我编写了这个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检查。任何帮助将非常感激。

1 个答案:

答案 0 :(得分:0)

只需删除代码部分

即可

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

并将其替换为简单的exit 1我能够让它发挥作用。

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

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