どのように私は群れで実行したコマンドの終了コードをチェックしますか?
-
21-09-2019 - |
質問
挨拶すべて。私は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
所属していません StackOverflow