【问题标题】:PID checker will not work when running through crontab通过 crontab 运行时,PID 检查器将不起作用
【发布时间】:2014-03-24 21:09:58
【问题描述】:

好的,所以我有一个脚本,其中包含一个检查 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 检查。任何帮助将非常感激。

【问题讨论】:

  • 你确定cron执行的环境有一个合适的PATH变量来查找cat/echo/ps/grep?您的脚本开头是否有#!/bin/bash,以便您确定它正在通过正确的解释器运行?
  • +1,第一个问题很好。如何使用 set -vx 打开调试/跟踪并重定向 crontab cmd 行上的所有输出,如 59 23 24 03 * /path/to/MyProg.sh > /tmp/myProg.Trace 2>&1 ?祝你好运
  • 谢谢你的帮助,我修好了。我最终摆脱了 if 语句 if [ echo "${RUNNINGNAME}" | grep -c *${SCRIPTNAME}* -eq "1" ]; then echo "${SCRIPTNAME} is already running." exit 1 并告诉它如果存储的 pid 与正在运行的 pid 匹配则退出 1。对不起,我浪费了你的时间。
  • 您可以发布您修改后的脚本作为您问题的答案,然后在 48 小时后接受它,以增加您的声誉积分。祝你好运。

标签: bash postgresql cron crontab pid


【解决方案1】:

通过简单地删除代码部分

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

并用一个简单的exit 1 替换它,我就能让它工作。

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

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

【讨论】:

    猜你喜欢
    • 2023-03-09
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多