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 프로세스가 이미 종료되었으므로 이로 인해 스크립트가 종료됩니다. 즉시.