我有一个备份脚本,它将我的快照发送到异地位置。
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 过程?