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プログラムを開始し、スクリプトを終了する
私はautosys自体には詳しくありませんが、次のようにバックグラウンドで長時間実行コマンドを開始できます。
#!/bin/ksh
Nohup Java DemoJavaProgram 1> output.file 2>&1 </dev/null &
Nohup
コマンドを使用すると、Java
コマンドがハングアップシグナルを切り抜けることができます。次に、入力と出力がリダイレクトされます。最後に&
演算子を指定すると、コマンドがバックグラウンドで実行されます。
ここでは終了ステータスコードに依存できないことに注意してください。 Java
コマンドが何らかの理由で開始に失敗した場合、エラーメッセージが出力ファイルに書き込まれて終了します。
要件に従って、return
関数をexit
に置き換える必要があります。
以下を試して確認できますか?
#!/bin/ksh
Java DemoJavaProgram
RESULT=$?
if [ "$RESULT" -eq 0 ]
then
echo "SUCCESS"
exit 1
else
echo "FAILURE"
fi
私があなたの開始スクリプトを理解している限り、あなたはそれを必要としません。このようにリダイレクトして、Javaプログラムを簡単に開始します。
Java DemoJavaProgram >output.txt
JavaプログラムSystem.out.print*
のすべての出力は、output.txtファイルで発生します。output.txtでSystem.err.print*
も必要な場合は、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行を表示して続行します。
質問は私にとって少し不可解です。少なくとも、あなたが使用したい(tee
への)パイプのせいではありません。この機能を維持するには、次のスクリプトを使用できます。
_#!/bin/ksh
tee output.file < <( Java DemoJavaProgram ) &
_
それでおしまい。スクリプトは終了し、Javaプログラムは引き続きバックグラウンドで実行され、Javaプログラムによるstdout上のデータ出力は、stdoutと_output.file
_。
単純に_ps -aux | grep scriptName.ksh
_を実行すると、スクリプトがまだ実行されていると誤解される可能性があることに注意してください。プロセス置換<(...)
は、元のスクリプトの名前を持つサブシェルプロセスで実行されるためですですが、実際にはtee
の子です。親、つまり上記のスクリプトは、たとえば_ps -o pid,ppid,tty,comm -H
_で検査できるPPID(つまり、親PID)値から明らかなように、終了しました。
私はautosys
にも精通していませんが、長期実行プログラムをudevルールまたはユーザーセッションから開始するために使用できる1つのハック(およびNohup
にもかかわらず、systemdによるバックグラウンドジョブの強制終了の回避策)は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