シェルの終わり

シェルの終わり

Javaプログラムを呼び出すbashシェルスクリプトがあります。 Javaがシャットダウン/完了しましたが、プロセスがまだプロセスリストにある場合はありますか?

以下はcronjobを呼び出す実行内容です。 cronジョブはプロセスが終了したことを確認するためです。終わりがなければ呼び出されません。

クローンタップ-l

55-59/60 1-23 * * * [ `ps aux | grep /var/local/ImportPO.sh | grep -v grep | wc -l` -eq 0 ] && sh /var/local/ImportPO.sh > /dev/null 2>&1

ImportPO.shの内容

#!/bin/sh

echo "Starting process ..";

JAR_DIR=/var/local/JavaLib8/
CLASS_PATH=/var/local/classes

JAR_LIB=
for i in $(ls $JAR_DIR)
do
        JAR_LIB=$JAR_LIB:$JAR_DIR$i
done

/usr/java/jdk1.8/bin/java -cp "$JAR_LIB:$CLASS_PATH" com.ExtractPORequest 

シェルの終わり

ps -auxを実行すると、Javaプログラムが完了してプログラムの終わりに達した後もプロセスが6時間以上実行されていることがわかります。 jpsコマンドを使用して確認しましたが、プロセスにJavaレベルが存在しません。

root     26091  0.0  0.0 106108  1192 ?        Ts   06:55   0:00 /bin/sh -c [ `ps aux | grep /var/local/ImportPO.sh | grep -v grep | wc -l` -eq 0 ] && sh /var/local/ImportPO.sh > /dev/null 2>&1

root     26113  0.0  0.0 106112  1268 ?        T    06:55   0:00 sh /var/local/ImportPO.sh

答え1

root 26113 0.0 0.0 106112 1268 ? T 06:55 0:00 sh /var/local/ImportPO.sh

ここで、プロセス状態は、T「ジョブ制御信号によって停止される」を示すものです。ps(1)マニュアルページ

これが停止する理由は、誰かがSIGSTOP、SIGTSTPを送信したか、Javaプロセスが標準入力から読み取ろうとしたためです(有用な入力がパイプ/リダイレクトされない限り、cron操作にはこれらの入力がありません)。

コメントでプロセスが終了したと言われました(つまり、ゾンビプロセス)。 「ゾンビのためには何もできません。すでに死んでいます。代わりに邪悪なゾンビマスターを殺してください!」、つまり問題は独自の子プロセスから返された結果コードを解決しない、存在しないプロセスの名前。

存在しないJavaの親スクリプトがスクリプトImportPO.shの場合、SIGCONTを送信すると続行できます。その状態のプロセスのPIDがT26113の場合はkill -CONT 26113続行できます。 Java プロセスの開始はスクリプトの最後のコマンドであり、Java プロセスはすでに終了しているため、スクリプトは終了します。すぐに。

関連情報