web-dev-qa-db-ja.com

無期限に実行中の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プログラムを開始し、スクリプトを終了する

2
Govinda Sakhare

私はautosys自体には詳しくありませんが、次のようにバックグラウンドで長時間実行コマンドを開始できます。

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

Nohupコマンドを使用すると、Javaコマンドがハングアップシグナルを切り抜けることができます。次に、入力と出力がリダイレクトされます。最後に&演算子を指定すると、コマンドがバックグラウンドで実行されます。

ここでは終了ステータスコードに依存できないことに注意してください。 Javaコマンドが何らかの理由で開始に失敗した場合、エラーメッセージが出力ファイルに書き込まれて終了します。

1
Haxiel

要件に従って、return関数をexitに置き換える必要があります。

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

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

私があなたの開始スクリプトを理解している限り、あなたはそれを必要としません。このようにリダイレクトして、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行を表示して続行します。

0
Lars

質問は私にとって少し不可解です。少なくとも、あなたが使用したい(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)値から明らかなように、終了しました。

0
ozzy

私は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
0
pizdelect