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


11

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

linux  cron 

アプリが既に実行されている場合、または別のプロセスが既に実行されている場合に、アプリを実行しないかどうかを明確にしますか?ありがとう
Linker3000

回答:


23

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

crontab:

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

この答えの単純さが大好きです。参考までに、-fフラグをpgrepに追加し、プロセスの完全な名前を確認できます。これは、プロセスの引数を条件の一部として検査する場合にも役立ちます。
Craig Sefton、2014年

6
いいえ、cronjob内のpgrepで-fフラグを使用することはできません。その理由は、cronjob自体を実行するために使用されるシェルスクリプトと照合するためです。
CpnCrunch

cronでGUIプロセスを実行するときは、エラーexport DISPLAY=:0を防ぐために先頭にを付けCould not connect to displayます。* * * * * export DISPLAY=:0 && pgrep processname > /dev/null || /path/to/processname -args0 -args1
ベンジャム2018年

9

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

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

1
FYI-スカラー変数を使用して引数リストを格納することは、悪い習慣と見なされています。失敗した場合の例については、mywiki.wooledge.org / BashFAQ / 050を参照してください。
Charles Duffy、

...同様に、pgrep myprog; if [ $? -ne 0 ]; then ...より良いように記述されるだろうif ! pgrep myprog; then ...
チャールズ・ダフィー

...この後者のスタイルは、より読みやすくなるだけでなく、エラーが発生しにくくなり$?ます。たとえば、ログメッセージを追加したり、行間にエラー処理を追加したりすることで、意図せずにの値を混乱させるのは簡単です。
Charles Duffy、

7

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

3

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

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


いいね!今rsyncのこの遅い回線上で手動の介入なしの行に来て、クライアントホストの5分以内に発射、それが必要とするすべての時間を取ることができます:*/5 * * * * root flock /run/shm rsync -auhx --numeric-ids -e "ssh -T -c arcfour128 -o Compression=no -x" [source] [user]@[host]:[dest]
eMPee584

1

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

1)その名前のプロセスがすでに実行されているかどうかを確認するgrepための出力ps

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

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


0

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.