SIGTERM не завершает скрипт - PullRequest
0 голосов
/ 25 мая 2020

Я пытаюсь понять этот сценарий:

#!/usr/bin/env sh

trap "pkill -f sleep" term

sleep 1000

После запуска сценария я хотел бы остановить его, отправив SIGTERM:

# run script in the background
$ ./signals.sh &
[1] 5389

# check if script is running
$ ps aux | grep 'signals.sh\|sleep' | grep -v grep
sergioro  5389  0.0  0.0 216520  3112 pts/0    S    09:07   0:00 sh ./signals.sh
sergioro  5390  0.0  0.0 214984   708 pts/0    S    09:07   0:00 sleep 1000

# send SIGTERM to script
$ pkill -fe signals.sh
sh killed (pid 5389)

# why hasn't the script stopped after receiving SIGTERM?
$ ps aux | grep 'signals.sh\|sleep' | grep -v grep
sergioro  5389  0.0  0.0 216520  3112 pts/0    S    09:07   0:00 sh ./signals.sh
sergioro  5390  0.0  0.0 214984   708 pts/0    S    09:07   0:00 sleep 1000

# send SIGTERM to `sleep` command
$ pkill -fe sleep
sleep killed (pid 5390)
Terminated

# script has stopped
$ ps aux | grep 'signals.sh\|sleep' | grep -v grep

Мой вопрос как остановить скрипт, отправив SIGTERM самому скрипту, а не команде sleep? И почему trap в скрипте не завершает команду сна?

1 Ответ

5 голосов
/ 25 мая 2020

Оболочка может обработать trap только после завершения sleep.

Это может достичь того, чего вы ожидали:

#!/usr/bin/env sh

trap "pkill -f sleep" term

sleep 1000 & wait

См. Раздел СИГНАЛЫ на странице руководства, особенно последний абзац:

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

...