2
Не создаётся core dump в PostgreSQL
Мой PostgreSQL начал внезапно падать, и я хотел сгенерировать core dump, но файл не создаётся.
Вот что я сделал:
1. Настроил:
ulimit -S -c unlimited 2. Добавил строку в /etc/security/limits.conf:
* soft core unlimited 3. Задал путь для core dump:
kernel.core_pattern="/coredumps/core-%e-%s-%u-%g-%p-%t"4. Дал права на каталог:
chmod 777 /coredumps5. Тестировал:
perl -MPOSIX -e '$0="test"; pause' &
kill -ABRT Файл создавался в нужной директории.
Когда падает PostgreSQL, в логах вижу:
Resource limits disable core dumping for process 3607766 (postmaster).
Process 3607766 (postmaster) of user 26 dumped core.
systemd-coredump@13-140614-0.service: Succeeded.Заметил, что у тестового процесса через cat /proc/pid/limits «Max core
file size" — "unlimited", а у PostgreSQL — "0".Что может быть не так?
Ответы
Захар Романов
(Изменено)
Если сервис уже запущен и ты не хочешь его перезапускать, можно попробовать изменить лимиты для работающего процесса с помощью команды prlimit:
Это установит лимиты на core dump для уже запущенного процесса. Однако это временное решение — после перезапуска PostgreSQL нужно будет снова применить команду, поэтому лучше настроить лимиты через systemd, как описано выше.
Пётр Беляков
(Изменено)
Проблема в том, что лимиты на core dump не глобальные для системы, а применяются к каждому процессу отдельно. Когда ты делаешь ulimit, это влияет только на текущую сессию Bash, а не на другие процессы или сервисы, такие как PostgreSQL.
Так как сервисы не используют обычный процесс логина, они не наследуют настройки из /etc/security/limits.conf.
Для настройки лимитов для PostgreSQL нужно добавить параметр LimitCORE=infinity в файл его сервиса через systemd.
Вот как это сделать:
Затем добавь:
Сохрани и перезапусти сервис: