好的,所以我有一个脚本,其中包含一个检查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检查。任何帮助将非常感激。
答案 0 :(得分:0)
只需删除代码部分
即可 if [ echo "${RUNNINGNAME}" | grep -c *${SCRIPTNAME}* -eq "1" ]; then
echo "${SCRIPTNAME} is already running."
exit 1
fi
并将其替换为简单的exit 1
我能够让它发挥作用。
出于某种原因,cron不喜欢这部分脚本。手动运行时,最好保留它,因为它有助于您的脚本实际上是在存储的pid下运行的脚本。这是一个很小的机会,通常只会因用户错误而发生,但建立这种可能性是一个好主意。
我仍然不确定为什么这会在cron中打破,但确实如此。