В 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
См., Например, Расширение параметра
SIGTERM
аналогичен любому другому сигналу в том смысле, что он может быть перехвачен процессом. Получение сигнала просто заставит процесс перейти к специальной подпрограмме обработчика сигнала. Для SIGTERM
действием по умолчанию будет завершение процесса, но, например, редактор может захотеть поймать сигнал, чтобы сохранить черновик любых открытых файлов перед смертью. Если процесс остановлен, он не сможет запустить обработчик сигнала, но сигнал останется в ожидании, пока процесс не будет продолжен. Обратите внимание, что число отправленных сигналов обычно не сохраняется.
Теоретически система может узнать, установлен ли в процессе обработчик сигналов для SIGTERM
, и немедленно завершить его, если нет. Но (согласно комментарию Жиля) POSIX требует, чтобы сигнал был отложен до тех пор, пока процесс не будет продолжен через SIGCONT
.
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
для процесса отбрасываются, когда он получает сигнал остановки