我有一些脚本,它们有自己的工作,必须不断循环运行。我设法在 java servlet 中启动 shell 脚本。而 Servlet 运行在 Tomcat 上。然而,当我杀死服务器(它是为了测试)时,所有正在运行的 shell 脚本都死了,没有进程可以再被 grepped。
另外,因此,我必须将我的服务器更改为 Glassfish。事实证明,即使我杀死了 Glassfish,由在 Glassfish 中运行的应用程序启动的进程仍然存在!!!这很令人困惑,因为我认为它们应该是相同的结果。就其广泛使用和更快的管理控制台而言,tomcat 是首选。
有谁知道如何将启动的进程返回到tomcat中的shell。我不知道问题出在哪里。 我启动脚本的代码是:
ProcessBuilder pb= new ProcessBuilder("/bin/bash", "scriptDir/" + "xx.sh");
pb.start ;
通常我可以立即从终端获取 PID。一旦 tomcat 被杀死,它们也会消失。
最佳答案
我做了以下测试:
案例 1:
- 在 tomcat 上启动应用程序
- 启动所有脚本
- grep 以确保所有进程都已启动
- 杀死tomcat并再次grep
result: all process die
案例 2:
- 在 glassfish 上启动应用
- 启动所有脚本
- grep 以确保所有进程都开始
- 杀死 glassfish 并再次 grep
结果:所有进程保持存活
案例3:
- 在 tomcat 上启动应用
- 在 glassfish(另一个端口)上启动应用
- 在tomcat上使用app启动所有脚本
- 确定 grep
3-1
- 杀死 Tomcat
- 再次grep
结果:所有进程保持存活
- 然后杀死 Glassfish
结果:所有进程仍然存在
3-2
- 杀死 Glassfish
- 再次grep
结果:所有进程保持存活
- 杀死 Tomcat
result: all process die
所以我认为 glassfish 是我的唯一选择。可能是 tomcat 和 glassfish 在终止期间具有不同的机制。 Tomcat 似乎杀死了所有分层子进程,而 glassfish 忽略了它们。
关于java - tomcat运行shell脚本并将进程返回给系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29347566/