![为什么向 httpd 发送 SIGHUP 信号会终止 tomcat 进程?](https://linux22.com/image/489115/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%90%91%20httpd%20%E5%8F%91%E9%80%81%20SIGHUP%20%E4%BF%A1%E5%8F%B7%E4%BC%9A%E7%BB%88%E6%AD%A2%20tomcat%20%E8%BF%9B%E7%A8%8B%EF%BC%9F.png)
我有一台服务器,其中 tomcat 进程绑定到端口 80,httpd 进程绑定到端口 5000。由于某种原因,每次任何进程向 httpd 进程发送 SIGHUP 信号时,我的 tomcat 进程就会消失,没有任何错误或任何内容。
我按照以下方式修复了服务器上的问题,在 httpd.conf 中添加了明确的 ServerName 指令,从而修复了该问题。
我还是不明白为什么 httpd 的 SIGHUP 会杀死 tomcat 进程。
注 1:我使用以下命令复制了终止信号:
找出 httpd pid 是什么。
cat /etc/httpd/run/httpd.pid
4056
然后用叹息信号杀死
kill -s SIGHUP 4056
注2:我们对该问题进行了故障排除,发现每天早上4点运行的logrotate都会发送SIGHUP信号来释放日志以便能够轮换它们,从而也杀死了tomcat。
答案1
我认为 tomcat 是由 apache 生成的。
问题可能是当 Apache 关闭其日志文件时,tomcat 正尝试访问该日志文件,并且当它突然发现该文件神奇地消失了时,它就崩溃并死机了。
另一种解释是,Apache 服务器在轮换日志和重新加载配置文件(由 SIGHUP 启动)时也在重置 tomcat,而某些错误或其他原因阻止 tomcat 在此时重新启动。
答案2
正如 towo 上面所说,如果您从 Apache 内部运行的 PHP 脚本启动 Tomcat,则可能会发生这种情况。我遇到了这个问题,并想在这里记录以下内容,以便其他能够做到这一点的人 :-)。
使用 setsid 启动 Tomcat,这将确保它被放入其自己的进程组,完全将其与您或 logrotate 发送给 Apache 的任何信号(包括 SIGHUP)隔离。尝试以下操作:
/usr/bin/setsid $CATALINA_HOME/bin/startup.sh