私は仕事があります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
私はどちらにも慣れていませんが、autosys
udevルールまたはユーザーセッションで長期実行プログラムを起動するために使用できる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.txt
output.txtの最後の10行を表示して続行します。