私はJava実行可能なjarを持っていて、それが実行されていないか、何らかの理由で終了したらそれを実行する必要があるので、このためにcrontabを使用することにしました。
「poppetapp」ユーザーとしてcrontabを実行する必要があるため、そのユーザーとしてログインし、次のcrontabを作成しました。
*/5 * * * * pgrep -f test_java_10.jar || cd /home/poppetapp && /home/poppetapp/test_java.sh > /home/poppetapp/test_java.out
私のシェルスクリプトは次のとおりです。場所は/home/poppetapp/
-
#!/bin/sh
/usr/home/java -jar /home/poppetapp/test_java_10.jar
私のJava実行可能jarは "poppetapp"ユーザーのホームポジションにあります/home/poppetapp/
。
だから私の質問は - これは正しいと思いますか?test_java_10.jar
実行されていないか、何らかの理由で終了した場合にのみ起動するだけで、実行中であることを確認するために5分ごとに実行されるcrontabを作成しました。実行していない場合は、シェルスクリプトを実行してプロセスを開始してくださいtest_java_10.jar
。
しかし、どういうわけかcrontabを変更すると、多くのtest_java_10.jar
プロセスが呼び出されることがわかります。 5分ごとにこれに対する別のプロセスが始まるようです。
直す:-
crontabをこのように修正すると -
*/5 * * * * pgrep -f test_java_10.jar || /home/poppetapp/test_java.sh > /home/poppetapp/test_java.out
その後、次のメールを見ましたが、問題が何であるか説明していないか、説明がありますか?
& t 35
Message 35:
From poppetapp@machineA Tue Mar 24 17:05:01 2015
X-Original-To: poppetapp
From: root@machineA (Cron Daemon)
To: poppetapp@machineA
Subject: Cron <poppetapp@machineA> pgrep -f test_java_10.jar || /home/poppetapp/test_java.sh > /home/poppetapp/test_java.out
Content-Type: text/plain; charset=ANSI_X3.4-1968
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/poppetapp>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=poppetapp>
Date: Tue, 24 Mar 2015 17:05:01 -0700 (GMT+7)
答え1
私の考えではグループ化の問題ではないかと思います。お使いの携帯電話をpgrep
簡単または次に置き換えました。true
false
プロセスが実行されていない場合は
pgrep
失敗します。$ false || echo cd && echo run cd run
プロセスが実行されている場合は
pgrep
成功します。$ true || echo cd && echo run run
この場合、何も実行したくありません!実行時に
true || (echo cd && echo run)
何も表示しないことが私たちが望むものです。
私はそれを試してみることをお勧めしますpgrep -f test_java_10.jar || (cd /home/poppetapp && /home/poppetapp/test_java.sh > /home/poppetapp/test_java.out)
。
答え2
同様の利点||
は、戻りコードに基づいて何かを実行できることです。例えば、左があればfalse
右を評価し、そうでなければ気にしません。
しかし、ここに問題があります。 pgrepのマニュアルページを見てください。
pgrepユーティリティとpkillユーティリティは、終了時に次のいずれかの値を返します。 0 は 1 つ以上のプロセスと一致します。 1 一致するプロセスがありません。
だから実際にそうです0
。false
マッチ- 実際には、Javaプロセスがすでに実行されている場合にのみ開始されます。 :).
||
に切り替える&&
と、目的の結果が得られます。しかし、実際には、将来の読者が同じことを理解する必要がないように、これをスクリプトに入れることを提案したいと思います。
私は提案したい - grepプロセスは本質的に少し信頼できません。pid
ファイルをロックするか、これでこれを行うことができます。
答え3
ジョセフR私よりもロジックをよりよく説明しました。
cd /home/poppetapp &&
必要な結果を得るには、次の項目のみを削除して使用することをお勧めします。
*/5 * * * * pgrep -f test_java_10.jar || /home/poppetapp/test_java.sh > /home/poppetapp/test_java.out
答え4
||
and演算子の優先順位の問題を回避するには、&&
ロジックをスクリプトに移動するだけです。
#!/bin/sh -e
if ! pgrep -f test_java_10.jar >&2; then
cd "$HOME"
/usr/home/java -jar ./test_java_10.jar
fi
次に、5分ごとにcrontabからこのスクリプトを呼び出します。
*/5 * * * * "$HOME/test_java.sh"