Предположим, что я запускаю скрипт
$ nohup ./myscript </dev/null >/dev/null 2>&1 &
и затем уничтожьте его
$ pkill myscript
Как мой сценарий может быть разработан так, чтобы, когда он получает SIGKILL
сигнал, другая команда выполняется?
Вы не можете поймать SIGKILL
(и SIGSTOP
), таким образом включая Ваш пользовательский обработчик для SIGKILL
спорно.
Можно поймать все другие сигналы, поэтому возможно, попытаться сделать дизайн вокруг тех.
Также при выполнении:
pkill myscript
будьте значением по умолчанию pkill
отправит SIGTERM
, нет SIGKILL
, который, очевидно, может быть пойман.
Например, в Вашем сценарии, в вершине, добавьте:
trap 'echo foobar' TERM
trap
встроенная оболочка используется, чтобы захватить сигнал, и диспетчеризировать любой пользовательский обработчик или проигнорировать сигнал в целом.
Здесь команда echo foobar
будет выполнен, когда оболочка получит TERM
.
Можно сделать то же для других сигналов также, также изменить команду для удовлетворения потребностей. Например, выполнение обоих echo foobar
и выполнение пользовательского сценария обработчика:
trap 'echo foobar; /my/custom/handler.sh' TERM
Если у Вас есть план к exit
после этого:
trap 'echo foobar; /my/custom/handler.sh; exit' TERM
Принял ответ говорит, что вы не можете поймать SIGKILL. Кстати, вы все еще можете наблюдать за PID вашего скрипта, чтобы убедиться, что он все еще работает. Это даже можно сделать, запустив этот наблюдатель в подпроцессе вашего текущего сценария:
#!/bin/bash
# Launch a sleeping child process that will be "waited" next
sleep infinity & PID=$!
# Trap "graceful" kills and use them to kill the sleeping child
trap "kill $PID" TERM
# Launch a subprocess not attached to this script that will trigger
# commands after its end
( sh -c "
# Watch main script PID. Sleep duration can be ajusted
# depending on reaction speed you want
while [ -e /proc/$ ]; do sleep 3; done
# Kill the infinite sleep if it's still running
[ -e /proc/$PID ] && kill $PID
# Commands to launch after any stop
echo "Terminating"
" & )
# Commands to launch before waiting
echo "Starting"
# Waiting for infinite sleep to end...
wait
# Commands to launch after graceful stop
echo "Graceful ending"
Оригинальный сценарий прерывания из https://stackoverflow.com/a/39128574/1324228 [ 111]