
Я использую Centos 7 с php-fpm 5.4. Я обнаружил ошибку SIGSEGV (сигнал 11) в моих журналах ошибок php-fpm и хочу ее отладить.
Я последовал советуphp5 fpm: как сгенерировать дамп ядра из segfault?но 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 switcher user перед запуском пулов. Поэтому мне пришлось изменить fs.suid_dumpable
на 1
, как указано на
https://itnext.io/linux-processes-core-dumps-systemd-coredump-and-debian-cf2ddb11ef9e
sysctl -w fs.suid_dumpable=1