cron:仅当进程未运行时才运行它?

cron:仅当进程未运行时才运行它?

有没有办法让我告诉 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 所建议的那样。

相关内容