我试过这个:
Runtime.getRuntime().exec("/bin/bash -c " + System.getProperty("catalina.home") + "/logs/shutdown.sh && " + System.getProperty("catalina.home") + "/bin/startup.sh");
但是只有shutdown正常,Tomcat没有正常启动,我认为问题是之前的实例还在使用端口8080。我在两个命令之间添加了一个sleep 2m(用&&分隔),但是在这种情况下,发生关机,但根据catalina日志,后来什么也没发生,没有错误,根本没有执行启动。
(我第一次尝试不使用/bin/bash -c,但在那种情况下什么也没有发生。)
最佳答案
切勿使用 Runtime.getRuntime().exec(String)
。它并不像人们期望的那样工作。请改用接受 String[]
的版本。
另外,在后台运行它并重定向 stdout/stderr,否则它会阻塞等待 java 进程读取它的输入。
Runtime.getRuntime().exec(new String[] {
"/bin/bash", "-c",
"(" +
System.getProperty("catalina.home") + "/bin/shutdown.sh && " +
System.getProperty("catalina.home") + "/bin/startup.sh" +
") > ~/restart.log 2>&1 &"
});
这里它写入~/restart.log
,这样如果它失败了,你可以看到错误信息。当它工作时,您可以用 /dev/null
替换它。
我强烈建议创建一个新脚本 restart_tomcat
来执行所有这些后台和重定向,这样您就可以将其减少到
Runtime.getRuntime().exec(new String[] { "/path/to/restart_tomcat" });
与嵌入在 Java 代码中的脚本相比,在文件系统上使用脚本更容易、更灵活。
关于java - 如何从 Tomcat 中的 Web 应用程序在 Linux 中重启 Tomcat?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21734370/