Чому я не можу вбити процес SIGSTOP 'SIGTERM, і де зберігається очікуваний сигнал?


24

Я використовую розтяжку Debian (systemd). Я запускав демон переднього плану rsyslog на передньому плані, /usr/sbin/rsyslogd -n і зробив Ctrl+, Zщоб зупинити його. Стан процесу змінився на Tl(зупинений, потоковий). Я видав кілька команд для цього процесу, а також стан процесу було те ж саме: . Як тільки я зробив це , він помер. У мене 3 питання.kill -15 <pid>Tlfg

  • Чому SIGSTOPпроцес -ed не відповів SIGTERM? Чому ядро ​​підтримує його в одному стані?
  • Чому його вбили в той момент, коли він отримав SIGCONTсигнал?
  • Якщо це було через попередній SIGTERMсигнал, де він зберігався, поки процес не відновився?

Відповіді:


41

SIGSTOPі SIGKILLце два сигнали, які не можуть бути захоплені та оброблені процесом. SIGTSTPсхоже, SIGSTOPза винятком того, що з нею можна зловити і поводитися.

SIGSTOPІ SIGTSTPсигнали зупинки процесу в своїх напрямках, готові до SIGCONT. Коли ви надсилаєте цей процес a SIGTERM, процес не запускається, тому він не може запустити код для виходу.

(Є також SIGTTINі SIGTTOUякі є сигналами, генерованими шаром TTY, коли фонове завдання намагається прочитати або записати в термінал. Вони можуть бути спіймані, але в іншому випадку зупинять (призупиняють) процес, як і колись SIGTSTP. Але я зараз іду ігнорувати ці два на залишок цієї відповіді.)

Ви CtrlZнадсилаєте процес a SIGTSTP, який, як видається, ніяким чином не обробляється rsyslogd, тому він просто призупиняє процес очікування SIGCONTабо SIGKILL.

Рішення тут також полягає в надсиланні SIGCONTпісля вашого, SIGTERMщоб процес міг приймати і обробляти сигнал.

Приклад:

sleep 999 &

# Assume we got PID 456 for this process
kill -TSTP 456    # Suspend the process (nicely)
kill -TERM 456    # Terminate the process (nicely). Nothing happens
kill -CONT 456    # Continue the process so it can exit cleanly

Документація до бібліотеки GNU C пояснює це досить добре, я думаю (моє виділення):

Поки процес зупинений, більше сигналів до нього не можна подавати, поки він не буде продовжений , крім SIGKILLсигналів та (очевидно) SIGCONTсигналів. Сигнали позначаються як очікувані, але не надходять до продовження процесу. Сигнал завжди викликає припинення процесу і не може бути заблокований, обробляється або ігнорується. Ви можете ігнорувати , але це завжди призводить до продовження процесу, якщо він зупинений. Надсилання сигналу до процесу призводить до відмови будь-яких очікуваних сигналів зупинки для цього процесу. Аналогічно, будь-які очікувані сигнали для процесу відкидаються, коли він приймає сигнал зупинкиSIGKILLSIGCONTSIGCONTSIGCONT


1
@nohup. відповідь розширена, але по суті, "так; вона обробляла kill -15вже відправлене".
roaima

2
@nohup так, згідно з документацією: « Поки процес зупинений, більше сигналів до нього не можна надсилати, поки він не буде продовжений ... Сигнали позначаються як очікувані, але не доставляються, поки процес не буде продовжено. »
roaima

1
Дивіться також SIGTTIN та SIGTTOU, які також зупиняють процеси
Stéphane Chazelas

1
@ StéphaneChazelas хороший момент. Я додав згадки про них, але інакше їх проігнорував. Будь ласка, не соромтесь редагувати, як вважаєте за потрібне.
roaima

2
@coteyr. Я не погоджуюся: SIGKILLзаважає програмі очищатись, тому використання SIGTERMкращого у більшості випадків.
roaima

9

SIGTERMтак само, як і будь-який інший сигнал у тому, що його може вловлювати процес. Отримання сигналу просто змусить процес перейти до спеціального режиму обробника сигналу. За SIGTERMзамовчуванням дія буде припиняти процес, але, наприклад, редактор може захотіти зафіксувати сигнал, щоб він міг зберегти чернетку копії будь-яких відкритих файлів перед смертю. Якщо процес зупинено, він не може запустити обробник сигналу, але сигнал залишиться в очікуванні, поки процес не триває. Зауважте, що кількість надісланих сигналів зазвичай не зберігається.

Теоретично система могла б знати, чи встановлений для цього обробник сигналів SIGTERM, і негайно припинити його, якщо ні. Але (відповідно до коментаря Гілла) POSIX вимагає, щоб сигнал вийшов, поки процес не буде продовжено через SIGCONT.


4
Вибачте, мій попередній коментар був неправильним. Поки процес зупиняється, до нього не надходять сигнали, крім SIGKILL і SIGCONT. Навіть якщо сигнал має свою дію за замовчуванням, яка полягає в знищенні процесу, це затримується, поки процес не відновиться SIGCONT. POSIX наказує таку поведінку.
Жил "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.