有没有办法让我告诉 cron 运行一个应用程序,但如果进程已经存在就不运行它?
答案1
最简单的方法,使用 pgrep
在 crontab 中:
* * * * * pgrep processname > /dev/null || /path/to/processname -args0 -args1
答案2
运行脚本,而不是直接运行程序。有很多种方法。例如:
MYPROG="myprog"
RESTART="myprog params"
PGREP="/usr/bin/pgrep"
# find myprog pid
$PGREP ${MYPROG}
# if not running
if [ $? -ne 0 ]
then
$RESTART
fi
答案3
如果前一个实例尚未完成,此脚本将不会再次运行。如果您希望在另一个特定进程正在运行时不运行某些程序,请参阅 harrymc 的脚本。
DATE=`date +%c`;
ME=`basename "$0"`;
LCK="./${ME}.LCK";
exec 8>$LCK;
if flock -n -x 8; then
echo ""
echo "Starting your script..."
echo ""
[PUT YOUR STUFF HERE]
echo ""
echo "Script started $DATE";
echo "Script finished `date +%c`";
else
echo "Script NOT started - previous one still running at $DATE";
fi
答案4
这通常由程序本身处理,而不是由 处理cron
。有两种标准技术可以实现此目的:
1)grep
输出以ps
查看是否有同名进程正在运行
2) 启动时,首先检查 pid(进程 ID)文件是否存在,通常位于/var/run/program_name.pid
,如果存在,则从文件中读取 pid 并检查该进程是否仍然存在;如果存在,则拒绝启动。如果 pid 文件不存在或文件中的 pid 已消失,则创建一个 pid 文件,将进程 ID 写入其中,然后继续正常启动。
虽然从技术上来说,可以将执行上述任一操作的 bash 管道直接写入 crontab,但最好将它们添加到正在启动的程序中(这样无论如何启动它们都会应用)或编写包装脚本来处理这个问题,正如 harrymc 所建议的那样。