Почему я не могу убить SIGSTOP'ированный процесс с помощью SIGTERM, и где хранится ожидающий сигнал?

В bash вы может удалить самую длинную ведущую подстроку, оканчивающуюся не цифрой, из переменной $ var , используя подстановку параметра $ {var ## [^ 0-9]} или (POSIXly ) $ {var ## [! 0-9]} например

$ echo "$x --> ${x##*[^0-9]}"
abcde12345 --> 12345
$ 
$ echo "$y --> ${y##*[^0-9]}"
s'ldfsd[opsk12345 --> 12345
$ 
$ echo "$z --> ${z##*[^0-9]}"
1234sdfsdfafa23456 --> 23456

См., Например, Расширение параметра

26
29.07.2016, 11:09
2 ответа

SIGTERM аналогичен любому другому сигналу в том смысле, что он может быть перехвачен процессом. Получение сигнала просто заставит процесс перейти к специальной подпрограмме обработчика сигнала. Для SIGTERM действием по умолчанию будет завершение процесса, но, например, редактор может захотеть поймать сигнал, чтобы сохранить черновик любых открытых файлов перед смертью. Если процесс остановлен, он не сможет запустить обработчик сигнала, но сигнал останется в ожидании, пока процесс не будет продолжен. Обратите внимание, что число отправленных сигналов обычно не сохраняется.

Теоретически система может узнать, установлен ли в процессе обработчик сигналов для SIGTERM , и немедленно завершить его, если нет. Но (согласно комментарию Жиля) POSIX требует, чтобы сигнал был отложен до тех пор, пока процесс не будет продолжен через SIGCONT .

10
20.08.2021, 12:02

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

Сигналы SIGSTOP и SIGTSTP останавливают процесс на своем пути, готовый к SIGCONT . Когда вы отправляете этому процессу SIGTERM , процесс не выполняется и поэтому не может выполнить код для выхода.

(Существуют также SIGTTIN и SIGTTOU , которые представляют собой сигналы, генерируемые уровнем TTY, когда фоновое задание пытается прочитать или записать на терминал. Они могут быть обнаружены, но будут в противном случае остановите (приостановите) процесс, как SIGTSTP , но теперь я проигнорирую эти два до конца этого ответа.)

Ваш Ctrl Z отправляет процессу 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 . Сигналы помечаются как ожидающие, но не доставляются, пока процесс не будет продолжен. Сигнал SIGKILL всегда вызывает завершение процесса и не может быть заблокирован, обработан или проигнорирован. Вы можете игнорировать SIGCONT , но это всегда приводит к продолжению процесса, если он остановлен. Отправка сигнала SIGCONT процессу вызывает отбрасывание всех ожидающих сигналов остановки для этого процесса. Аналогичным образом, любые ожидающие обработки сигналы SIGCONT для процесса отбрасываются, когда он получает сигнал остановки

43
20.08.2021, 12:02

Теги

Похожие вопросы