Я заметил, что в Fedora 17 операция выключения (например, shutdown -h now) стала намного быстрее (по ощущениям, максимум 2 секунды). Поэтому мне интересно, правильно ли завершаются запущенные процессы? Особенно в Fedora (опять же, около 2 секунд), я с трудом могу представить, что у каждого процесса достаточно времени для завершения.
Я предполагаю, что все пользовательские процессы были закрыты пользователем (вручную) до подачи команды на выключение, поэтому остались только системные службы (хотя им тоже может быть что-то нужно сделать при выходе).
Поэтому я написал маленькую программку, которая перехватывает большинство сигналов, и если указано число (секунд), она будет ждать перед выходом. Кроме этого, она ничего не делает. Затем — сначала в системе Debian — я запустил ее с задержкой в 60 секунд. Когда она получила SIGHUP (я предполагаю, что ее родительская оболочка была завершена), она начала 60-секундный обратный отсчет. Через 10 секунд она получила дружественный SIGTERM. Моя программа проигнорировала этот сигнал и продолжила обратный отсчет — до 40-й секунды, когда она трагически умерла. Так что через 20 секунд после того, как ей было сказано завершиться (SIGHUP), она получила SIGKILL.
Теперь тот же тест на 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, посмотрите их файлы служб, чтобы узнать, как они организуют чистое завершение работы.