2016-06-23 21 views
1

毎時1回更新をチェックするスクリプトを呼び出すcronジョブがあります。更新がある場合は、update.shと呼び、commands.shとなります。新しい "commands.sh"を正確に1回実行したいと思います。シェルスクリプトをcronjobで1回実行する

commands.shにそのファイルの一意のIDを付けて実行するたびに、ファイルに書き込むことを考えていました。 commands.shを実行する前に、ファイルにIDがcommands.shであるかどうかを確認します。その場合は、実行しないでください。

編集 - 詳細:

cronジョブ:

  • 引っ張るとマージし、gitのレポからのフェッチがあれば変更
  • 実行update.sh

    #!/bin/sh 
    ./commands.sh 
    

I ./commands.shを1回だけ実行したい場合は、次の時間、cronは再び動いて、gitから引き出し、update.shを再度実行します。各ユニーク./commands.shが一度だけ実行できる方法はありますか?

gitリポジトリからの変更があった場合は、update.shを実行するのが一番良い方法でしょうか?

これは過剰殺人のように思われます。一度だけ実行されるbashスクリプトを書くより簡単な方法はありますか? (これが格納されていてもよいどこでも便利にパスを指定する)stampfileと呼ばれるファイルのための

if [ -f stampfile ]; then 
    exit 
if 
touch stampfile 

このチェック:commands.shスクリプトの開始時

+1

次回のアップデートが予定されているときに、 'commands.sh'の以前のインスタンスがまだ実行されているという問題はありますか?誰が他のインスタンスを呼び出すのですか? –

+0

'update.sh'から' mv commands.sh commands.sh-done-(timestamp) 'が可能ですか? – indiv

+0

いくつかの編集を追加しました。 – Nick

答えて

1

は、これを行います。それがあれば、ただexit。それがなければtouchで作成してください。

スクリプトを実行させます。

少し曖昧さ:これは、スクリプトの2つのインスタンスを同時に実行しないようにするためにも使用できます。そのスクリプトは実行の最後にrm -f stampfileになります。

この場合、スクリプトが強制終了された場合、stampfileは「無効」(スタンプは存在しますが、スクリプトは有効ではありません)です。古いstampfileを検出するには、スクリプトのPIDをタッチするのではなく、そのPIDを入れます。別のインスタンスが実行されている、とstampfile管理があるかどう

を確認するには:

if [ -f stampfile ]; then 
    if kill -0 $(<stampfile) 2>/dev/null; then 
     exit 
    else 
     rm -f stampfile # stale 
    fi 
fi 
echo $$ >stampfile 

# rest of script 

rm -f stampfile 

ユーザー@CharlesDuffyがstampfileを管理するこの方法は、PID再利用の問題になりやすい得ることを指摘し、すなわちその中にPID古くなったstampfileは、これと何の関係もない実行中のプロセスである可能性があります。明らかにこれをより堅牢な方法で行うことを可能にするa Linux utility called flockがあります。

+0

PIDベースのロック検出は非常に理想的ではありません.PIDは決して一意であるとは決して保証されません。再起動や他のハードシャットダウンのシナリオを含め、プロセスの終了時に自動的にクリアされる 'flock'ベースのロックを考慮してください。 –

+0

@CharlesDuffy 'flock'は私のシステム(OpenBSDとMac OS X)では利用できないので、テストすることはできません。ごめんなさい。私はMacでは 'shlock'を持っていますが、OpenBSDではそうはありません。ポータブルな代替品はありますか? – Kusalananda

+0

'util-linux'に縛られていない実装についてはhttps://github.com/discoteq/flockを参照してください。私は残念ながら、 'lockfile'コマンドが利用可能であることを覚えています。これは、yoreの日に' flock() 'または' fcntl(LOCK _ *) 'を使用することができます(Solaris、Linux、 what-else)、しかしそれが遅れていかに積極的に維持しているかは分かりません。 –

関連する問題