web-dev-qa-db-ja.com

cron:プロセスを実行しますが、実行していない場合のみですか?

Cronにアプリを実行するように指示する方法はありますが、プロセスがすでに存在する場合は実行しないでください。

11
user3109

最も簡単な方法は、pgrepを使用することです

crontab:

* * * * * pgrep processname > /dev/null || /path/to/processname -args0 -args1
23
Rich Homolka

プログラムを直接実行するのではなく、スクリプトを実行します。多くの可能性があります。例えば ​​:

MYPROG="myprog"
RESTART="myprog params"
PGREP="/usr/bin/pgrep"
# find myprog pid
$PGREP ${MYPROG}
# if not running
if [ $? -ne 0 ]
then
   $RESTART
fi
9
harrymc

前のインスタンスが完了していない場合、このスクリプトは再度実行されません。別の特定のプロセスが実行されているときに何かを実行したくない場合は、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
7
Linker3000

スクリプトでロックファイルを使用することもできますが、 プロセス管理 を参照してください。

flock は、使用できる1つのユーティリティです。

これは通常、cronではなくプログラム自体によって処理されます。これには2つの標準的な手法があります。

1)greppsの出力により、その名前のプロセスがすでに実行されているかどうかを確認します

2)起動時に、最初にpid(プロセスID)ファイルの存在を確認します。通常は/var/run/program_name.pidにあります。存在する場合は、ファイルからpidを読み取り、そのプロセスがまだ存在するかどうかを確認します。ある場合は、開始を拒否します。 pidファイルが存在しないか、ファイル内のpidがなくなっている場合は、pidファイルを作成し、そこにプロセスIDを書き込んで、通常の起動を続行します。

これらのいずれかを直接実行するbashパイプをcrontabに書き込むことは技術的に可能ですが、開始するプログラムに追加するか(開始方法に関係なく適用されるようにする)、またはラッパースクリプトを作成することをお勧めしますハリーマックが示唆したように、これを処理します。

1
Dave Sherohman

* * * * * pgrep -f "[p]attern" > /dev/null || /path/to/processname -args0 -args1

上記の回答を再利用して、パターンマッチングを改善しました。 fオプションのないpgrepはプロセスパターンと一致しません。しかし、fオプションの使用には問題があります。 fオプションを使用すると、cronを生成するシェルは常に一致し、そのpidを返すため、プロセスは再起動されません。

文字パターンの1つに[]を追加すると、プロセスのみに一致し、cronシェルのpidは返されません。

0