Статус процесса linux при выгрузке ядра

Скажем, у меня есть процесс, который будет генерировать огромный файл ядра, если он каким-то образом выйдет из строя (например, mysql). Я хочу знать, в каком состоянии находится процесс при выгрузке ядра. Все как раньше или меняется на зомби?

Моя реальная жизненная проблема такова: у меня есть монитор, который проверяет статус процесса. Как только он поймет, что процесс падает (отслеживая статус процесса), он что-то сделает. Я хочу убедиться, что монитор что-то делает только после завершения дампа ядра. Вот почему я хочу знать статус процесса при выгрузке ядра.


person Shanpei Zhou    schedule 06.02.2015    source источник
comment
Будет ли это иметь значение, ведь обычно, когда ядро ​​выгружено, процесс завершается?   -  person Some programmer dude    schedule 06.02.2015
comment
Что бы сделал монитор? Он запускает процесс с fork?   -  person Basile Starynkevitch    schedule 06.02.2015
comment
@JoachimPileborg Допустим, дамп ядра занимает 10 минут и при этом он меняет свой статус на плохой. Тогда мой монитор может подумать, что процесс сбой, и начать удалять основной файл.   -  person Shanpei Zhou    schedule 06.02.2015
comment
Это просто: если статус меняется на выполнение дампа ядра (я не знаю, реальный ли это статус), вы продолжаете отслеживать процесс, и когда он завершается, вы знаете, что дамп ядра завершен.   -  person Some programmer dude    schedule 06.02.2015
comment
@BasileStarynkevitch Я так думаю. Я написал его на Python и использовал psutil для создания процесса. Я думаю, это использовать вилку. Монитор - это поток, который использует некоторую библиотеку в psutil для проверки состояния процесса.   -  person Shanpei Zhou    schedule 06.02.2015
comment
@JoachimPileborg Это именно то, что я хочу знать. Какой статус при выгрузке ядра процесса.   -  person Shanpei Zhou    schedule 06.02.2015


Ответы (1)


Если ваш монитор запускает процессы с fork, он должен получать SIGCHLD сигналы, тогда вызовите waitpid (2). AFAIK waitpid сообщит вам, когда core сброс будет завершен (и не вернется успешно до этого)

См. Также core (5)

Возможно, используя возможности inotify (7) в каталоге, содержащем core дамп может помочь.

И systemd тоже может быть актуальным (подробностей я не знаю)

Кстати, во время дампа ядра я считаю, что статус процесса (как сообщается через proc (5) в 3 поле rd из /proc/$PID/stat) равно

       D  Waiting in uninterruptible disk sleep

Так что, если вас беспокоит долгое core время дампа, вы можете, например, каждые полсекунды зацикливаться на fopen, затем fscanf, затем fclose этот /proc/$PID/stat псевдо-файл, пока статус не перестанет D

Наконец, дампы ядра обычно бывают быстрыми (если только вы не запускаете суперкомпьютер с терабайтом ОЗУ) в наши дни (в Linux с хорошей файловой системой, такой как Ext4 или BTRFS), потому что я считаю, что (если у вас достаточно ОЗУ) файл дампа ядра остается в кеше страниц. Отвалы ядра продолжительностью полчаса были обычным явлением в прошлом веке на суперкомпьютерах (Cray) того времени.

Конечно, вы также можете stat (2) core файл.

См. Также http://www.linuxatemyram.com/

person Basile Starynkevitch    schedule 06.02.2015
comment
Извините, я не очень хорошо объяснил проблему. Монитор не разветвляет процесс. Это просто поток для проверки состояния интересующего меня процесса (но этот поток принадлежит родительскому процессу процесса). - person Shanpei Zhou; 06.02.2015
comment
Похоже, вас может заинтересовать systemd (но я не знаю подробностей) - person Basile Starynkevitch; 06.02.2015