Varios de mis programas habituales se bloquean (regularmente) con el mensaje "Señal 1 definida por el usuario". Sé que hay un nohup
comando, pero ¿hay un nousr1
comando? ¿O algo que haga algo como nohup
pero con USR1?
Varios de mis programas habituales se bloquean (regularmente) con el mensaje "Señal 1 definida por el usuario". Sé que hay un nohup
comando, pero ¿hay un nousr1
comando? ¿O algo que haga algo como nohup
pero con USR1?
Una solución hacky simple para tener la utilidad análoga a nohup
, pero para SIGUSR1
, sería obtener una copia de la fuente coreutils , descomprimirla, hacer
sed -i 's/SIGHUP/SIGUSR1/' /path/to/coreutils/src/nohup.c
, opcionalmente también cambia el nombre del archivo de salida
sed -i 's/nohup\.out/nousr1.out/g' /path/to/coreutils/src/nohup.c
, compile esta fuente e instale el nohup
binario recién compilado para /usr/bin/nousr1
:
cp /path/to/coreutils/src/nohup /usr/bin/nousr1
Después de esto, como lo comprobé, sleep 1000
sale USR1
, mientras que nousr1 sleep 1000
es inmune a esta señal.
nohup
, por cierto, es desasociar el proceso del terminal para que no se envíe SIGHUP
en primer lugar. Que también configure un controlador de señal es una ventaja adicional, pero debería ser innecesaria.
signal(SIGHUP,SIG_IGN);
llamada nohup.c
, el proceso recibirá el SIGHUP
. Además nohup
de ignorar la señal, lo único que hace es volver a abrir los descriptores stdin, stdout, stderr como archivos no terminales. Realmente no disocia el proceso del terminal de ninguna manera especial. Es decir, el proceso se enviará SIGHUP
cuando el terminal cuelgue. Por otro lado, está bash, que hace algo similar con el disown
comando, pero no estoy seguro de cómo se implementa, tal vez en la forma en que te refieres.
¿Qué tal el trap
comando de shell incorporado?
trap 'echo "Thou shalt not USR1 me"' USR1
Debe usar la forma del trap
comando con un argumento en blanco. Prueba esto:
trap '' SIGUSR1; myprogram
Esto ignorará la señal SIGUSR1, que es lo que está tratando de hacer. Aunque estoy de acuerdo con los comentaristas en que probablemente hay más cosas aquí de lo que parece.
La forma incorrecta:
trap 'echo ...' SIGUSR1; myprogram
aún permitirá myprogram
recibir el SIGUSR1 pero el shell ejecutará echo
el trap
comando.
trap '' SIGUSR1; gvimdiff file1 file2
y Vim murió con "Vim: Señal mortal capturada USR1".