我们有一个调用 java 程序的 bash shell 脚本。是否会发生java结束/完成但进程仍在进程列表中的情况?
下面是execute的内容,它调用了一个cronjob。因为 cron 作业将检查进程是否结束。如果没有结束,则不会调用。
crontab -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程序完成并到达程序末尾,我们仍然发现该进程存在(运行超过六个小时)。我使用 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 可能会允许其继续。如果该状态下的进程的PIDT
是26113,那么kill -CONT 26113
将允许它继续...并且由于启动Java进程是脚本中的最后一个命令并且Java进程已经结束,这应该会导致脚本立即退出。