Cron 启动脚本两次

Cron 启动脚本两次

我有一个备份脚本,它将我的快照发送到异地位置。

0 0 * * * /root/backup/backup_incremental >> /root/backup/test.log

由于某种原因,我的 PID 文件应该停止脚本形式的第二次执行,但它不能与 cron 一起使用。如果我打开两个 shell 并启动脚本两次,一切都会按预期工作。

#!/usr/local/bin/zsh

PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin 
DATE=`date "+%Y-%m-%d_%H-%M-%S"` 

SCRIPTNAME=`basename $0`
PIDFILE=/var/run/${SCRIPTNAME}.pid


if [ -f ${PIDFILE} ]; then
       #verify if the process is actually still running under this pid
         OLDPID=`cat ${PIDFILE}`
         RESULT=`ps -ef | grep ${OLDPID} | grep ${SCRIPTNAME}`  

         if [ -n "${RESULT}" ]; then
             echo "${DATE}: Script already running (PID: ${OLDPID})! Exiting"
             exit 255
         fi

fi

#grab pid of this process and update the pid file with it
PID=`ps -ef | grep ${SCRIPTNAME} | head -n1 | awk ' {print $2;} '`
echo ${PID} > ${PIDFILE}

#send it
....


if [ -f ${PIDFILE} ]; then
    rm ${PIDFILE}
fi

这是我的脚本,精简了重要部分。

所以我的问题是 cron 如何多次启动这个?

答案1

PID=`ps -ef | grep ${SCRIPTNAME} | head -n1 | awk ' {print $2;} '`

这可能会返回脚本的 PID,或者进程的 PID grep,或者某些恰好具有足够相似名称的不相关进程的 PID。这可能是导致您的问题的原因:有时您的脚本将自己的 PID 写入 pidfile,有时它会写入其他内容。

脚本的 PID 在变量中$$

对于您实际需要查找给定进程名称的 PID 的情况,请参阅查找进程的ID并杀死它grep - 为什么 grep 模式中的括号会从 ps 结果中删除 grep 过程?

相关内容