我正在运行带有 php-fpm 5.4 的 Centos 7。我在 php-fpm 错误日志中遇到了 (信号 11) SIGSEGV 错误,我想对其进行调试。
我听从了php5 fpm:如何从段错误生成核心转储?但 php-fpm 仍未尝试生成核心转储。来自 php-fpm 错误日志:
WARNING: [pool website.com] child 26953 exited on signal 11 (SIGSEGV) after 0.931337 seconds from start
如果已生成核心转储,它将被读取(SEGSEGV - core dumped)
,但事实并非如此。
答案1
我也遇到过这个问题。似乎在 centos 上,主php-fpm
进程以 root 权限启动,然后以降低的权限(php-fpm
默认情况下为 centos 上的用户)启动各个池。
对我来说,问题在于,如果某个进程改变了自己的执行权限,则不允许生成核心转储文件,除非/proc/sys/fs/suid_dumpable
设置为允许这样做。请参阅有关此内核级控制的信息这里。
答案2
我能够通过以下方法解决这个问题:
- 添加到 /etc/systemd/system.conf 文件:
DefaultLimitCORE=infinity
- 改变了 kernel.core_pattern:
sysctl kernel.core_pattern='| /usr/lib/systemd/systemd-coredump %p %u %g %s %t %c %e'
- 重新加载 systemd 配置:
systemctl daemon-reload
作为 php-fpm 的额外步骤,需要在您想要监控的各个 php-fpm 池文件中设置以下指令:
rlimit_core = 无限制
systemd-coredump 程序的默认目录是,/var/lib/systemd/coredump
因此您应该在这里看到生成的转储文件。
答案3
在启动池之前,我必须切换到 PHP-FPM 切换器用户。因此,我必须按照上所述更改fs.suid_dumpable
为1
https://itnext.io/linux-processes-core-dumps-systemd-coredump-and-debian-cf2ddb11ef9e
sysctl -w fs.suid_dumpable=1