我有一个服务器,它的 tomcat 进程绑定到端口 80,httpd 进程绑定到端口 5000。由于某种原因,每次任何进程向 httpd 进程发送 SIGHUP 信号时,我的 tomcat 进程都会消失而没有错误或任何东西。
我通过以下方式修复了服务器上的问题,在 httpd.conf 中添加了一个明确的 ServerName 指令并解决了问题。
我仍然不明白为什么 SIGHUP 到 httpd 杀死了 tomcat 进程。
注意 1:我使用以下命令复制了 kill 信号:
找出 httpd pid 是什么。
cat /etc/httpd/run/httpd.pid
4056
然后用叹息信号杀死
kill -s SIGHUP 4056
注意 2:我们对问题进行了故障排除,发现每天早上 4 点运行的 logrotate 正在发送一个 SIGHUP 信号以释放日志以便能够旋转它们,从而也杀死了 tomcat。
我假设tomcat是由apache生成的。
问题可能是,当 Apache 关闭它的日志文件时,tomcat 正试图访问该日志文件,当它突然发现它已经神奇地消失时,它就会倒下并死掉。
另一种解释是 Apache 服务器在轮换日志和重新加载配置文件(由 SIGHUP 启动)时也在重置 tomcat,并且某些错误或其他错误会阻止 tomcat 在那时重新启动。
如上所述,如果您从运行在 Apache 中的 PHP 脚本启动 Tomcat,就会发生这种情况。我遇到了这个问题,并认为我会在这里为其他任何设法做到这一点的人注意以下内容:-)。
使用 setid 启动 Tomcat,这将确保它被放入自己的进程组中,将它与您或 logrotate 发送到 Apache 的任何信号(包括 SIGHUP)完全隔离。尝试类似:
/usr/bin/setsid $CATALINA_HOME/bin/startup.sh