我试过了:
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,但在那种情况下没有发生任何事情。)
答案 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代码中的脚本更容易,也更灵活。