2012-10-10 16 views
8

Tengo un script bash que monta y desmonta un dispositivo, que realiza algunas operaciones de lectura en el medio. Dado que el dispositivo es muy lento, el script tarda unos 15 segundos en completarse (el montaje tarda al menos 5-6 segundos). Como dejar este dispositivo montado puede causar otros problemas, no quiero que este script se interrumpa.Script Bash: no se puede manejar correctamente SIGTSTP

Habiendo dicho eso, puedo manejar correctamente SIGINT (Ctrl + c), pero cuando trato de manejar SIGTSTP (Ctrl + z), el script se congela. Lo que significa que la señal está atrapada pero el controlador no se ejecuta.

#!/bin/sh 
cleanup() 
{ 
    # Don't worry about unmounting yet. Just checking if trap works. 
    echo "Quitting..." > /dev/tty 
    exit 0 
} 
trap 'cleanup' SIGTSTP 
... 

Tengo que enviar manualmente la señal KILL al proceso. ¿Alguna idea de por qué está sucediendo esto y cómo puedo solucionarlo?

Respuesta

4

El shell no ejecuta la captura hasta que finaliza el proceso en ejecución. (al menos, ese es el comportamiento de bash 3.00.15). Si envía SIGINT a través de^c, se envía a todos los procesos en el grupo de procesos en primer plano; si el programa actualmente en ejecución lo recibe y termina, bash puede ejecutar la trampa. De manera similar con SIGTSTP vía^z; bash recibe la señal pero no ejecuta la captura hasta que finaliza el programa que se estaba ejecutando, lo que no ocurre si toma el comportamiento predeterminado y se suspende. Intente reemplazar ... con un simple read f y tenga en cuenta que la trampa se ejecuta inmediatamente.

+0

Eso tiene tanto sentido. Por lo tanto, parece que a menos que todos los binarios que ejecuta con el script también manejen^z de la forma en que lo hace, no hay forma de manejar adecuadamente^z. ¿Está bien? – Ram

+0

Puede ejecutar el trabajo asincrónicamente en setsid y esperarlo. por ejemplo: 'setsid cmd & wait' en lugar de simplemente' cmd'. –

+0

Parece que lo hace. ¡Gracias por tu ayuda! Pero, curioso, ¿no se mantendrá detenido el proceso en una nueva sesión? – Ram

Cuestiones relacionadas