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がT
26113の場合はkill -CONT 26113
続行できます。 Java プロセスの開始はスクリプトの最後のコマンドであり、Java プロセスはすでに終了しているため、スクリプトは終了します。すぐに。