好吧,所以我有一个包含检查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检查。任何帮助将非常感激。
您是否确定cron执行的环境具有适当的'PATH'变量来查找cat/echo/ps/grep?你的脚本开头是否有'#!/ bin/bash',以便你确定它正在通过正确的解释器运行? – Sammitch
+1,第一个问题很好。如何用'set -vx'打开调试/跟踪,然后像'59 23 24 03 * /path/to/MyProg.sh> /tmp/myProg.Trace 2>&1'那样重定向crontab cmd行上的所有输出?祝你好运 – shellter
感谢您的帮助,我解决了它。我最终摆脱了if语句'if [echo“$ {RUNNINGNAME}”| grep -c * $ {SCRIPTNAME} * -eq“1”];那么 echo“$ {SCRIPTNAME}已经在运行。” 退出1'并且刚刚告诉它退出1,如果存储的pid与正在运行的pid匹配。对不起,我浪费了你的时间。 – user3457244