Выполните другую команду, когда мой сценарий получит сигнал SIGKILL

Предположим, что я запускаю скрипт

$ nohup ./myscript </dev/null >/dev/null 2>&1 & 

и затем уничтожьте его

$ pkill myscript

Как мой сценарий может быть разработан так, чтобы, когда он получает SIGKILL сигнал, другая команда выполняется?

1
задан 4 October 2016 в 10:17

2 ответа

Вы не можете поймать SIGKILLSIGSTOP), таким образом включая Ваш пользовательский обработчик для 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
3
ответ дан 3 December 2019 в 06:57

Принял ответ говорит, что вы не можете поймать 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]

1
ответ дан 3 December 2019 в 06:57

Другие вопросы по тегам:

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