(Почему) не может ли Fedora правильно завершить все процессы при завершении работы?

Я заметил, что в Fedora 17 операция выключения (например, shutdown -h сейчас) стала намного быстрее (максимум 2 секунды). Так что мне интересно, если запущенные процессы завершены правильно? Особенно на Fedora (опять же, около 2 секунд), я с трудом могу себе представить, что у каждого процесса есть достаточно времени для завершения.

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

Поэтому я написал крошечную небольшую программу, которая улавливает большинство сигналов, и, если указано число (секунд), она будет ждать перед выходом. Кроме этого, он ничего не делает. Затем - сначала в системе Debian - я запустил его с задержкой в ​​60 секунд. Когда он получил SIGHUP (я предполагаю, что его родительская оболочка была прервана), он начал 60-секундный обратный отсчет. Через 10 секунд он получил дружественный SIGTERM. Моя программа проигнорировала этот сигнал и продолжила обратный отсчет - до секунд 40, когда он трагически погиб. Таким образом, через 20 секунд после того, как ему сказали прекратить (SIGHUP), он был SIGKILLed.

Теперь тот же тест на Fedora 17 (3.5.3-1.fc17.x86_64):

Пойманный сигнал 1.
Продолжительность: 8 секунд
Задержка завершения на 60 секунд...
60...
Поймал сигнал 15 - игнорируя!
59...
58...

Даже через одну секунду после SIGHUP он получает SIGTERM. Программист может отложить завершение своей программы после SIGTERM, чтобы завершить работу, сохранить настройки и так далее (в отличие, может быть, после SIGINT). Моя программа получает 2 секунды, прежде чем она будет убита.

Что если работающий процесс завершается при сохранении некоторых настроек (поврежденный файл настроек?) Или какой-то демон (например, файловый сервер) записывает кэшированные данные на диск (поврежденные данные?)?

1 ответ

Решение

Службы могут указать, как они хотят быть прекращены в их *.service файл. Вы можете выбрать любое время ожидания, вам не нужно жить по умолчанию. Если у вас установлен postgreSQL или mysqld, посмотрите их служебные файлы, чтобы увидеть, как они организуют чистое завершение работы.

Другие вопросы по тегам