3

こんにちは。bash スクリプトを実行する cron ジョブを設定していますが、前のスクリプトが終了する前に次のジョブが開始されるのではないかと心配です。flock少しグーグルで調べてみると、これに対処する一般的な方法は、次の方法で使用されるコマンドであることがわかります。

flock -n lockfile myscript.sh
if [ $? -eq 1 ]; then
    echo "Previous script is still running!  Can't execute!"
fi

これはうまくいきます。ただし、の終了コードを確認したい場合はどうすればよいですmyscript.shか? 返される終了コードはflock's によって上書きされるため、正常に実行されたかどうかを知る方法はありません。

4

4 に答える 4

6

、、の代替形式を使用できるようです。ここflockで、はファイル記述子です。これをサブシェルに入れ、そのファイル記述子をロックファイルにリダイレクトすると、flockはそのファイルに書き込めるまで待機します(または、すぐに開くことができず、合格した場合はエラーになります)。次に、実行するスクリプトの戻り値のテストを含め、サブシェルですべてを実行できます。flock <fd><fd>-n

(
  if flock -n 200
  then
    myscript.sh
    echo $?
  fi
) 200>lockfile
于 2009-12-26T21:54:57.110 に答える
0
#!/bin/bash

if ! pgrep myscript.sh; then
  flock -n lockfile myscript.sh
fi

私の理解が正しければ、cron がコマンドを再度実行しようとする前に、'myscript.sh' が実行されていないことを確認してください。これが正しいと仮定して、pgrep がプロセス リストで myscript.sh を見つけられなかったかどうかを確認し、そうである場合は flock コマンドを再度実行します。

于 2009-12-26T20:45:35.687 に答える
0

おそらく、このようなものがあなたのために働くでしょう。

#!/bin/bash
RETVAL=0
lockfailed()
{
        echo "cannot flock"
        exit 1
}
(
        flock -w 2 42 || lockfailed
        false
        RETVAL=$?
        echo "original retval $RETVAL"
        exit $RETVAL
) 42>|/tmp/flocker
RETVAL=$?
echo "returned $RETVAL"
exit $RETVAL
于 2013-10-21T14:34:18.437 に答える
0

flock のマニュアル ページによると、flock には -E または --exit-conflict-code フラグがあり、競合が発生した場合に flock の終了コードを設定するために使用できます。

     -E, --conflict-exit-code 番号
              -n オプションが使用されていて競合するロックが存在する場合、または -w オプションが使用されていてタイムアウトに達した場合に使用される終了ステータス。デフォルト値は 1 です。数値は 0 から 255 の範囲である必要があります。

マニュアルページには次のようにも記載されています。

終了ステータス
 
このコマンドは、すべてに対して sysexits.h 終了ステータス値を使用します。ただし、オプション -n または -w のいずれかを使用してロックの取得に失敗し、-E オプションで指定された終了ステータス (デフォルトでは 1) を報告する場合を除きます。-E で指定される終了ステータスは、0 から 255 の範囲でなければなりません。

コマンドバリアントを使用し、子を実行すると、終了ステータスは子コマンドの終了ステータスになります。

そのため、「コマンド」バリアントを使用しているときに -n または -w フラグを使用すると、両方の終了ステータスを確認できます。

例:

$ flock --exclusive /tmp/flock.lock bash -c 'exit 42'; echo $?
42

$ flock --exclusive /tmp/flock.lock flock --exclusive --nonblock --conflict-exit-code 100 /tmp/flock.lock bash -c 'exit 42'; echo $?
100

最初の例では、flock で実行しているプロセスの終了ステータスが返されることがわかります。2 番目の例では、ロックの競合を作成しています。その場合、flock 自体は、指定したステータス コード (100) を返します。--conflict-exit-code フラグで値を指定しない場合、代わりに 1 が返されます。ただし、値 1 を返す可能性のある他のプロセス/スクリプトからの混乱を防ぐために、あまり一般的でない値を設定することを好みます。

于 2021-11-18T21:13:24.577 に答える