systemadmin.es > Script > Capturar señales en scripts

Capturar señales en scripts

Al desarrollar shell scripts que realizan ciertas tareas debemos contemplar que pueden recibir señales como cualquier proceso. Vamos a ver como usar trap para capturar y gestionar estas señales:

Vamos a suponer que generamos un fichero que queremos eliminar si se manda un SIGTERM al script, para ello usaremos el comando trap con el comando o conjunto de comandos a ejecutar seguido de la señal o conjunto de señales a capturar. Por ejemplo:

trap 'rm /tmp/ejemplo.trap' SIGTERM

En este caso se ejecuta rm /tmp/ejemplo.trap en el caso de recibir un SIGTERM.

Podemos ver un ejemplo con el siguiente script:

#!/bin/bash

trap 'rm /tmp/ejemplo.trap' SIGTERM

touch /tmp/ejemplo.trap

while true;
do
        sleep 30;
done

Podemos dejarlo en background:

$ ./ejemplo.sh &
[1] 20736

Podemos ver como se ha creado el fichero en el /tmp:

$ ls /tmp/ejemplo.trap
/tmp/ejemplo.trap

En el caso que matemos el proceso se eliminará el fichero según hemos definido:

$ kill 20736
$ ls /tmp/
clamd.socket  mysql.sock

También mediante trap podemos definir las acciones a ejecutar cuando finalice el script:

#!/bin/bash

trap '{ echo "fin script"; pwd; }' EXIT

if [ $RANDOM -gt 1000 ];
then
        echo "caso 1"
        exit
else
        echo "caso 2"
fi

Por ejemplo si lo ejecutamos varias veces podemos ver como se ejecuta lo que hemos definido en el trap al finalizar el script por cualquiera de los 2 casos:

$ ./ejemplo.sh
caso 2
fin script
/home/jprats
$ ./ejemplo.sh
caso 1
fin script
/home/jprats

One comment to “Capturar señales en scripts”

  1. Joroba leer algo asi cuando he estado hace dos dias 2 horas para hacer esto !!

    trap "kill_all;exit $FIN" 2 3 15
    
    kill_all ()
    {
      kill -9 $PID1 $PID2
    }
    
    Tarea1
    PID1=$!
    Tarea2
    PID2=$!
    
    ./m_eva_tool.tcl TEST LOCAL
    FIN=$?
    
    kill_all
    exit $FIN
    

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>