Java 如何在Linux中从Tomcat内部的webapp重新启动Tomcat?

Java 如何在Linux中从Tomcat内部的webapp重新启动Tomcat?,java,linux,bash,tomcat,Java,Linux,Bash,Tomcat,我试过这个: Runtime.getRuntime().exec("/bin/bash -c " + System.getProperty("catalina.home") + "/logs/shutdown.sh && " + System.getProperty("catalina.home") + "/bin/startup.sh"); 但是只有关机工作正常,Tomcat没有正常启动,我认为问题在于之前的实例仍然使用端口8080。我在两个命令之间添加了一个sleep命令(

我试过这个:

Runtime.getRuntime().exec("/bin/bash -c " + System.getProperty("catalina.home") + "/logs/shutdown.sh && " + System.getProperty("catalina.home") + "/bin/startup.sh");
但是只有关机工作正常,Tomcat没有正常启动,我认为问题在于之前的实例仍然使用端口8080。我在两个命令之间添加了一个sleep命令(用&&&分隔),但在本例中,发生了关机,但根据catalina日志,后来什么也没有发生,没有错误,根本没有执行启动


(我第一次尝试不使用/bin/bash-c,但在这种情况下什么也没有发生。)

永远不要使用
Runtime.getRuntime().exec(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\u tomcat
,完成所有这些后台处理和重定向,这样您就可以将其简化为

Runtime.getRuntime().exec(new String[] { "/path/to/restart_tomcat" });

与Java代码中嵌入的脚本相比,在文件系统中使用脚本更容易、更灵活。

因此,如果您关闭了服务器和其中运行的所有应用程序,您希望其中一个应用程序如何重新启动它?我只希望它是由shell重新启动的。这在Windows中起作用:Runtime.getRuntime().exec(“cmd/c start shutdown.bat&&start startup.bat”);是否可以在后台进程中运行睡眠和启动,并分别关闭?谢谢您的回答。在您回答之前,我对exec(String)也做了同样的尝试,但它不起作用,但这个解决方案几乎起作用,唯一的问题是shutdown.sh还启动后台进程,停止tomcat,而主进程返回,因此startup.sh在shutdown结束之前启动,因此tomcat无法正常启动,由于使用的是its端口,因此仍在使用。这就是为什么我在2个脚本之间添加了sleep 2m,现在它可以工作了(用当前的应用关闭tomcat不到2分钟)。