GNU/Linux >> Tutoriales Linux >  >> Linux

¿Evitar que Signint llegue a los procesos secundarios?

Tengo una secuencia de comandos bash para ejecutar un servidor, que normalmente el usuario terminará usando Ctrl-C . Al salir, ejecuta una función de limpieza, que no quiero que sea interrumpida por un segundo Ctrl-C .

#!/bin/bash

...

function cleanup {
    trap '' INT
    echo -n " Cleaning up..."
    scp $SRV:~/$DIR/server.log . && ssh -t $SRV "rm -rf ~/$DIR"
    echo " Finished."

    exit 0
}
trap cleanup EXIT

...

Por el momento, un segundo Ctrl-C antes del scp ha finalizado hace que el script se cuelgue indefinidamente. Entiendo que esto tiene algo que ver con el SIGINT siendo enviado tanto al script bash como al scp proceso, pero no sé por qué esto hace que la secuencia de comandos se cuelgue, en lugar de simplemente hacer que falle la limpieza.

Entonces mi pregunta es:

  1. ¿Por qué esto hace que el script se cuelgue?
  2. ¿Cómo puedo evitar que SIGINT llegue al scp? y ssh procesos secundarios?

Respuesta aceptada:

trap '' INT está destinado a ignorar los SIGINT para el shell y todos sus hijos.

Pero mirando strace salidas en scp , parece scp instala su propio controlador SIGINT que cancela el SIG_IGN anterior.

La única forma de evitar que obtenga el SIGINT sería ejecutarlo en un grupo de procesos diferente como con:

perl -MPOSIX -e 'setpgid 0,0; exec @ARGV' scp...

o

(set -m; scp ... & wait)

o dígale al controlador tty que deje de enviar SIGINT sobre Ctrl-C (como con stty -isig , o stty intr '' para ^C solo), aunque querrá restaurar la configuración después:

saved=$(stty -g)
stty intr ''
scp ...
stty "$saved"

Linux
  1. ¿Procesos en una sesión en un shell interactivo versus en un script?

  2. Ejecutar programa desde dentro de un programa C

  3. Evite que ssh rompa los parámetros del script de shell

  4. El proceso hijo recibe SIGINT del padre

  5. Cómo obtener PID del proceso secundario bifurcado en el script de shell

¿Detectar si la tecla se presiona desde el script?

¿Evitar que Tmux se inicie en Ssh?

¿Evitar que Gnu Screen termine la sesión una vez que finaliza el script ejecutado?

¿Desde dónde se ejecuta un script de Shell?

Ejecutar script bash desde URL

MYSQL difiere en la salida del script