どのように私は群れで実行したコマンドの終了コードをチェックしますか?

StackOverflow https://stackoverflow.com/questions/1964301

質問

挨拶すべて。私はbashスクリプトを実行するcronジョブを設定していて、私は次の1が前の1終了する前に開始することを心配しています。少しグーグルでは、この問題に対処するための一般的な方法は、次のように使用flockコマンド、であることが明らかになった。

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

これは素晴らしい作品。私はmyscript.shの終了コードを確認したい場合は、私が何をしますか?それが成功したか実行された場合、私は知る方法はありませんので、どのような終了コードは戻り、flockので上書きされます。

役に立ちましたか?

解決

あなたはflockはファイルディスクリプタであるflock <fd>の代替形式、<fd>を、使用することができますように

に見えます。あなたがサブシェルにこれを入れて、あなたのロックファイルにそのファイルディスクリプタをリダイレクトする場合、それはそのファイルに書き込むことができるまで待つ(あるいは、それはすぐにそれを開くことができませんし、あなたが-nを通過してきたかどうかエラー)になる群れ。あなたは、あなたが実行するスクリプトの戻り値をテストするなど、あなたのサブシェルですべてを行うことができます:

(
  if flock -n 200
  then
    myscript.sh
    echo $?
  fi
) 200>lockfile

他のヒント

#!/bin/bash

if ! pgrep myscript.sh; then
  flock -n lockfile myscript.sh
fi
私は右のあなたを理解していれば、

、あなたは「myscript.sh」は再びあなたのコマンドを実行するcronの試みの前に実行されていないことを確認します。権利と仮定すると、私たちは、pgrepコマンドは、我々は再び群れのコマンドを実行してプロセスのリストにしている場合myscript.shを見つけることができなかったかどうかを確認します。

おそらくこのような何かがあなたのために働くだろう。

#!/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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top