Включение генерации core-файла осложняется двумя условиями: 1. использование контейнера openvz 2. использование модуля itk в Apache. В host системе настроил # sysctl -a | grep core kernel.core_uses_pid = 1 kernel.core_pattern = /tmp/core-%e-%s-%u-%g-%p-%t kernel.core_pipe_limit = 0 В контейнере видим то же самое: # sysctl -a | grep core kernel.core_uses_pid = 1 kernel.core_pattern = /tmp/core-%e-%s-%u-%g-%p-%t kernel.core_pipe_limit = 0 # grep core /etc/security/limits.d/50-defaults.conf * soft core unlimited # grep ulimit /etc/profile ulimit -Sc unlimited >/dev/null 2>&1 # grep ulimit /etc/sysconfig/httpd2 ulimit -c unlimited # ulimit -c unlimited Но для процесса apache всё равно # cat /proc/21233/limits Limit Soft Limit Hard Limit Units Max core file size 0 unlimited bytes При этом для процесса redis выставляется: # cat /proc/20739/limits Limit Soft Limit Hard Limit Units Max core file size unlimited unlimited bytes И # kill -11 20739 создаёт core-файл! # ls /tmp/core* /tmp/core-redis-server-11-497-495-20739-1445504489 и он подключается: # gdb /usr/sbin/redis-server /tmp/core-redis-server-11-497-495-20739-1445504489
Через strace видно, что кто-то безуспешно вызывает [pid 22059] prlimit64(0, RLIMIT_CORE, NULL, 0xbfc98d20) = -1 ENOSYS (Function not implemented) [pid 22059] ugetrlimit(RLIMIT_CORE, {rlim_cur=RLIM_INFINITY, rlim_max=RLIM_INFINITY}) = 0 [pid 22059] prlimit64(0, RLIMIT_CORE, NULL, 0xbfc98d80) = -1 ENOSYS (Function not implemented) [pid 22059] ugetrlimit(RLIMIT_CORE, {rlim_cur=RLIM_INFINITY, rlim_max=RLIM_INFINITY}) = 0 [pid 22059] prlimit64(0, RLIMIT_CORE, {rlim_cur=RLIM64_INFINITY, rlim_max=RLIM64_INFINITY}, NULL) = -1 ENOSYS (Function not implemented) [pid 22059] setrlimit(RLIMIT_CORE, {rlim_cur=RLIM_INFINITY, rlim_max=RLIM_INFINITY}) = 0 При этом удобный вызов prlimit не реализован в ядре: # strace -f prlimit -p 22471 -c prlimit64(22471, RLIMIT_CORE, NULL, 0xa0053c0) = -1 ENOSYS (Function not implemented) write(2, "prlimit: ", 9prlimit: ) = 9 write(2, "failed to get the CORE resource "..., 37failed to get the CORE resource limit) = 37 strace по ulimit -c показал такой вариант: prlimit64(0, RLIMIT_CORE, NULL, 0xbfd1b800) = -1 ENOSYS (Function not implemented) ugetrlimit(RLIMIT_CORE, {rlim_cur=RLIM_INFINITY, rlim_max=RLIM_INFINITY}) = 0 write(1, "unlimited\n", 10) Ну это ладно, VERSIONS The prlimit() system call is available since Linux 2.6.36. Library support is available since glibc 2.13. getrlimit/setrlimit есть давно. В итоге видим: # grep RLIMIT_CORE zz1 | grep setr [pid 22059] setrlimit(RLIMIT_CORE, {rlim_cur=RLIM_INFINITY, rlim_max=RLIM_INFINITY}) = 0 [pid 22071] setrlimit(RLIMIT_CORE, {rlim_cur=RLIM_INFINITY, rlim_max=RLIM_INFINITY}) = 0 [pid 22096] setrlimit(RLIMIT_CORE, {rlim_cur=RLIM_INFINITY, rlim_max=RLIM_INFINITY}) = 0 [pid 22096] setrlimit(RLIMIT_CORE, {rlim_cur=0, rlim_max=RLIM_INFINITY}) = 0 В хост-системе вызов так же не поддерживается: [root@azbyka ~]# prlimit prlimit: failed to get the AS resource limit: Функция не реализована В исходном коде Apache и apr1 не удалось обнаружить выставления RLIMIT_CORE.
В suhosin параметр suhosin.coredump = On лишь организует SegFault при ошибке: <------>/* dump core if wanted */ <------>if (SUHOSIN_G(coredump) && loglevel == S_MEMORY) { <------><------>volatile unsigned int *x = 0; <------><------>volatile int y = *x; <------>}
Написал в рассылку devel@lists.altlinux.org
Получил правильный совет https://lists.altlinux.org/pipermail/sysadmins/2014-June/036782.html и описал на wiki https://www.altlinux.org/Apache2/Coredump
Групповое закрытие решённых.