为什么向 httpd 发送 SIGHUP 信号会终止 tomcat 进程?

为什么向 httpd 发送 SIGHUP 信号会终止 tomcat 进程?

我有一台服务器,其中 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

相关内容