Сегодня то, что я делаю, и для которого я пытаюсь обнаружить дампы ядра и предупредить меня, на самом деле натолкнулось на ложное утверждение (то, что обычно ядро сбрасывает, когда я запускаю его в командной строке на переднем или на заднем плане), но ядро не сбрасывалось. Я написал этот простой тест:
int main
{
sleep(3);
assert(false);
}
который, когда я собираю и запускаю, будет дамп памяти все время. Но когда я поместил его в crontab, я вместо этого получил электронное письмо от демона cron:
rocket: main.cpp:10: int main(int, char**): Assertion `false' failed.
/bin/sh: line 1: 32448 Aborted ./rocket
и никакой основной файл не был помещен в /cores
, Почему это так и как я могу получить свое ядро?
Чтобы основной файл создавался при сбое, дампы ядра должны быть включены в текущей среде. Из оболочки это можно сделать с помощью ulimit:
ulimit -c unlimited
Что означает «установить максимальный размер дампа ядра на неограниченный». Ваша система, вероятно, настроена для этого в интерактивных оболочках, но не в заданиях cron. Чтобы сделать это из задания cron, вам нужно изменить это ограничение. Если задание cron является сценарием оболочки, который вызывает другие программы, вы можете просто вызвать ulimit
как указано выше. С другой стороны, если задание является исполняемым, вы можете создать оболочку для его запуска:
#!/bin/bash
ulimit -c unlimited
exec "$@"
Другой вариант — изменить программу, чтобы установить само ограничение, используя setrlimit функция.
Что касается того, почему ваши ядра собираются в / cores, а не в рабочий каталог: ваш дистрибутив мог скорректировать основной образец, возможно, с помощью программы для обработки основных файлов и размещения их в / cores.
Других решений пока нет …