Execute outro comando quando meu script receber o sinal SIGKILL

1

Suponha que eu execute um script

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

e depois matá-lo

$ pkill myscript

Como meu script pode ser projetado para que, quando receber o sinal SIGKILL , outro comando seja executado?

    
por user123456 04.10.2016 / 01:49

2 respostas

3

Você não pode capturar SIGKILL (e SIGSTOP ), portanto, não é possível ativar seu manipulador personalizado para SIGKILL .

Você pode pegar todos os outros sinais, então talvez tente fazer um design em torno deles.

Além disso, ao fazer:

pkill myscript

seja o padrão pkill enviará SIGTERM , não SIGKILL , o que obviamente pode ser detectado.

Por exemplo, dentro do seu script, na parte superior, adicione:

trap 'echo foobar' TERM

O shell trap embutido é usado para interceptar um sinal e despachar qualquer manipulador personalizado, ou ignorar o sinal completamente.

Aqui o comando echo foobar será executado quando o shell receber TERM .

Você também pode fazer o mesmo para outros sinais; modifique também o comando para atender sua necessidade. Por exemplo, executando echo foobar e executando um script de manipulador personalizado:

trap 'echo foobar; /my/custom/handler.sh' TERM

Se você planeja exit depois disso:

trap 'echo foobar; /my/custom/handler.sh; exit' TERM
    
por heemayl 04.10.2016 / 02:18
1

Aceitou resposta diz, você não pode pegar SIGKILL. By the way, você ainda pode assistir ao PID do seu script para ver se ele ainda está em execução. Isso pode até ser feito com o lançamento deste observador em um subprocesso do seu script atual:

#!/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"

Script de trap original do link

    
por JBreton 13.06.2018 / 18:21