java - 如何从 Tomcat 中的 Web 应用程序在 Linux 中重启 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");

但是只有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/

相关文章:

java - 使用 EntityManager 的两个实例时删除实体

javascript - 我需要网络开发的建议

php - 将 Laravel 从 Windows 迁移到 Linux Server

Linux PCIe DMA 驱动程序 (Xilinx XDMA)

r - 使用 bash 转换数字序列

linux - 在 Bash 中解析文件名

java - 我应该在哪里初始化变量才能在 IF block 中工作?

Java - Swing - MVC/观察者模式 - 如何构造这两个类以遵守 MVC 模式?

带有来自 csv 的字符串的 linux bash 构建命令

bash - 填充/填充 CSV 文件中缺失的列(使用制表符)