Сколько времени до SIGKILL

Я попытался выяснить, сколько времени дается приложению для выхода при получении SIGTERM, прежде чем оно отправит SIGKILL?

Мои знания об этих сигналах очень низкие. Я читал некоторые из них в предлагаемых ответах на Stackoverflow, но я не могу понять «приблизительно», сколько времени может прожить процесс, прежде чем он будет SIGTERminated.

РЕДАКТИРОВАТЬ: допустим, например, что я создаю проблему, которая намеренно блокирует выключение ОС (может быть, это может сделать while(1)?)

Я ищу ответ для процесса без MMI в стандартном дистрибутиве Linux, скажем, в Ubuntu с ядром 3.x.

Я предполагаю, что времени ожидания нет. Если процесс исчезает, система дает ему время освободить свои ресурсы. В противном случае система убивает его.


person Community    schedule 19.12.2014    source источник
comment
Есть ли конкретный контекст, в котором вы задаете этот вопрос, например, сигналы, отправляемые процессам при завершении работы? Если нет, то после TERM не обязательно отправляется KILL. Процесс может получить TERM, проигнорировать его и продолжать работать без проблем.   -  person cobbal    schedule 19.12.2014
comment
Вы пробовали команду time для проверки команды kill   -  person Skynet    schedule 19.12.2014
comment
@cobbal: мне трудно найти пример. Скажем, мои программы блокируют ОС или не заботятся о сигналах SIGKILL. Это более актуально в этом контексте? Иногда MMI может заблокировать ОС, например, из-за «Не отвечает» в Windows. Ищу аналогичный корпус, без MMI, на линуксе.   -  person    schedule 19.12.2014
comment
Время между чем-то, отправляющим SIGTERM процессу, и тем же самым чем-то, отправляющим SIGKILL, если предположить, что оно вообще это сделало, будет полностью контролироваться тем, как это что-то было написано. Поэтому вам нужно изучить скрипты, которые посылают сигналы, чтобы найти ответ. Мы не можем угадать...   -  person twalberg    schedule 19.12.2014


Ответы (1)


Скажем, например, что я создаю проблему, которая намеренно блокирует выключение ОС (может быть, какое-то время (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