無期限に実行されるJavaプログラムを含むシェルスクリプトを終了する

無期限に実行されるJavaプログラムを含むシェルスクリプトを終了する

私は仕事がありますautosys。このautosysタスクではスクリプトを実行していますshell。シェルスクリプトの実行無期限Javaプログラムを実行してみてください。無限forループについて話してください。

#!/bin/ksh

function abc() {
    java DemoJavaProgram
    RESULT=$?
    if[ $RESULT -eq 0 ]; then
        exit 0;
    else
        exit 1;
}
abc | tee output.file

上記のシェルスクリプトは何も返しませんが、Javaプログラムの実行に停止します。このautosys作業状態はRUNNING

成功せずにバックグラウンドで上記のコマンドを実行してみました&。この場合でも、成功しないままバックグラウンドでフルシェルスクリプトを実行してみました。

このようなスクリプトを終了する方法はありますか?

[tl;dr] Javaプログラムを起動してスクリプトを終了したい

答え1

私はautosys自体に慣れていませんが、次のようにバックグラウンドで長期実行コマンドを起動できます。

#!/bin/ksh
nohup java DemoJavaProgram 1> output.file 2>&1 </dev/null &

このnohupコマンドを使用すると、javaコマンドが壊れた信号にも生き残ることができます。その後、入力と出力がリダイレクトされます。&最後の演算子は、コマンドがバックグラウンドで実行されるように強制します。

ここでは終了ステータスコードに頼ることはできません。何らかの理由でコマンドが起動しない場合は、java出力ファイルにエラーメッセージを書き込んで終了します。

答え2

return要件に応じて機能を次のように変更する必要がありますexit

以下を試して確認できます。

#!/bin/ksh
java DemoJavaProgram
RESULT=$?
if [ "$RESULT" -eq 0 ]
 then
    echo "SUCCESS"
exit 1
else 
echo "FAILURE"
fi

答え3

私はどちらにも慣れていませんが、autosysudevルールまたはユーザーセッションで長期実行プログラムを起動するために使用できるnohupトリック(およびシャットダウンバックグラウンドタスクを回避する方法)は、at(1)コマンドを使用することです。

echo your_cmd | at now

すべての出力は、your_cmdそれを実行したユーザーにメールで送信されます。これが気に入らない場合は、リダイレクトを使用できます。

echo 'your_cmd >/dev/null 2>/path/to/errorlog' | at now

Linuxにはat非標準-Mオプションもあります。

echo 'your_cmd' | at -M now # ignore any output

残念ながら、情報メッセージをオフにするオプションがないため、at直接フィルタリングする必要があります。

#! /bin/sh
function run_with_at(){
    echo "$@" | at now 2>&1 |
        egrep >&2 -v '^warning: commands will be executed using /bin/sh$|^job [0-9]+ at'
}
run_with_at 'java DemoJavaProgram >/dev/null' # any stderr output will still be mailed to the user

答え4

起動スクリプトを理解する限り、必要ありません。このようなリダイレクトを使用してJavaプログラムを起動するだけです。

java DemoJavaProgram >output.txt

Javaプログラムのすべての出力はSystem.out.print*output.txtファイルに表示されます。System.err.print*出力.txtにも追加する必要がある場合は、2>&1追加ファイルにエラー出力を追加したい場合2>failure.txt、または実際にエラー出力が必要ない場合は追加2>/dev/null

バックグラウンドで起動する必要がある場合&

他のシステムで実行している場合は、@Haxielが述べたようにnohupを使用してください。

nohup java DemoJavaProgram 1> output.file 2>&1 </dev/null &

後でoutput.txtを確認する必要がある場合: tail -f output.txtoutput.txtの最後の10行を表示して続行します。

関連情報