【发布时间】: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