如何从Tomcat中的webapp重启Linux中的Tomcat?

时间:2014-02-12 16:54:30

标签: 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.我在两个命令之间加了一个睡眠2米(用&&分隔),但是这种情况下,关闭发生,但后来根据catalina日志没有发生任何事情,没有错误,启动没有被执行。

(我第一次尝试没有/ bin / bash -c,但在那种情况下没有发生任何事情。)

1 个答案:

答案 0 :(得分:1)

永远不要使用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代码中的脚本更容易,也更灵活。