Varios de mis programas habituales se bloquean (regularmente) con el mensaje "Señal 1 definida por el usuario". Sé que hay un nohupcomando, pero ¿hay un nousr1comando? ¿O algo que haga algo como nohuppero con USR1?
Varios de mis programas habituales se bloquean (regularmente) con el mensaje "Señal 1 definida por el usuario". Sé que hay un nohupcomando, pero ¿hay un nousr1comando? ¿O algo que haga algo como nohuppero con USR1?
Respuestas:
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 nohupbinario recién compilado para /usr/bin/nousr1:
cp /path/to/coreutils/src/nohup /usr/bin/nousr1
Después de esto, como lo comprobé, sleep 1000sale USR1, mientras que nousr1 sleep 1000es inmune a esta señal.
nohup, por cierto, es desasociar el proceso del terminal para que no se envíe SIGHUPen 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 nohupde 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á SIGHUPcuando el terminal cuelgue. Por otro lado, está bash, que hace algo similar con el disowncomando, pero no estoy seguro de cómo se implementa, tal vez en la forma en que te refieres.
¿Qué tal el trapcomando de shell incorporado?
trap 'echo "Thou shalt not USR1 me"' USR1
Debe usar la forma del trapcomando 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á myprogramrecibir el SIGUSR1 pero el shell ejecutará echoel trapcomando.
trap '' SIGUSR1; gvimdiff file1 file2y Vim murió con "Vim: Señal mortal capturada USR1".