Скажем, например, что я создаю проблему, которая намеренно блокирует выключение ОС (может быть, какое-то время (1) может это сделать?)
Неа. Это не сработает. Процесс не может игнорировать некоторые сигналы, такие как SIGKILL и SIGSTOP, за исключением init
.
В общем, вы можете отправить SIGKILL сразу после SIGTERM: стандартная задержка для завершения работы приложения отсутствует. Однако разумно дать такому приложению возможность аккуратно закрыться, прежде чем ядро сделает это без дальнейших уведомлений. порядок-должен-я-посылать-сигналы-мягкому-завершению-процессов?rq=1">здесь.
Что касается процедуры отключения системы, то она немного другая. Действительно, именно система init
решает, как и когда действовать; ОС помогает демону инициализации в этой операции, но косвенно (доставляя сигналы, очищая ресурсы и т. д.).
Получается, что это зависит от реализации. Анализируя systemd-217, кажется, что он ждет 10 секунд после отправки SIGTERM.
Из src/core/shutdown.c в main
log_info("Sending SIGTERM to remaining processes...");
broadcast_signal(SIGTERM, true, true);
log_info("Sending SIGKILL to remaining processes...");
broadcast_signal(SIGKILL, true, false);
Из src/core/killall.c в broadcast_signal
killall(sig, pids, send_sighup);
[...]
if (wait_for_exit)
wait_for_children(pids, &mask);
Продолжение в wait_for_children
until = now(CLOCK_MONOTONIC) + TIMEOUT_USEC;
[...]
k = sigtimedwait(mask, NULL, &ts);
if (k != SIGCHLD)
где TIMEOUT_USER
равно #define TIMEOUT_USEC (10 * USEC_PER_SEC)
Как видите, systemd ожидает сигнала SIGCHLD, который укажет, что дочерний процесс завершился, потому что большинство запущенных процессов являются дочерними процессами systemd.
person
edmz
schedule
19.12.2014
time
для проверки командыkill
- person Skynet   schedule 19.12.2014