Molti dei miei programmi regolari si bloccano (su base regolare) con il messaggio "Segnale 1 definito dall'utente". So che c'è un nohupcomando, ma c'è un nousr1comando? O qualcosa che farà qualcosa di simile nohupma con USR1?
Molti dei miei programmi regolari si bloccano (su base regolare) con il messaggio "Segnale 1 definito dall'utente". So che c'è un nohupcomando, ma c'è un nousr1comando? O qualcosa che farà qualcosa di simile nohupma con USR1?
Risposte:
Una soluzione hacky semplice per avere l'utilità analoga a nohup, ma per SIGUSR1, sarebbe quella di ottenere una copia del coreutils sorgente, decomprimerlo, fare
sed -i 's/SIGHUP/SIGUSR1/' /path/to/coreutils/src/nohup.c
, facoltativamente modificare anche il nome del file di output
sed -i 's/nohup\.out/nousr1.out/g' /path/to/coreutils/src/nohup.c
, compila questo sorgente e installa il nohupbinario appena compilato su /usr/bin/nousr1:
cp /path/to/coreutils/src/nohup /usr/bin/nousr1
Dopo questo, come ho verificato, sleep 1000esce USR1, mentre nousr1 sleep 1000è immune da questo segnale.
nohup, tra l'altro, è di dissociare il processo dal terminale in modo che non venga inviato SIGHUPin primo luogo. Che istituisca anche un gestore di segnale è un vantaggio aggiuntivo, ma non dovrebbe essere necessario.
signal(SIGHUP,SIG_IGN);chiamata nohup.c, il processo riceverà il SIGHUP. Ciò nohupche oltre a ignorare il segnale è semplicemente riaprire i descrittori stdin, stdout, stderr come file non terminali. In realtà non dissocia il processo dal terminale in alcun modo speciale. Cioè, il processo verrà inviato SIGHUPquando il terminale si blocca. Dall'altra parte c'è bash, che fa cosa simile con disownil comando, ma non sono sicuro di come si sia realizzata - forse nel modo che vuoi dire.
Che ne dici del trapcomando integrato della shell ?
trap 'echo "Thou shalt not USR1 me"' USR1
È necessario utilizzare il modulo del trapcomando con un argomento vuoto. Prova questo:
trap '' SIGUSR1; myprogram
Questo ignorerà il segnale SIGUSR1 che è quello che stai cercando di fare. Anche se concordo con i commentatori sul fatto che probabilmente qui sta succedendo più di quanto non sembri.
Il modulo errato:
trap 'echo ...' SIGUSR1; myprogram
consentirà comunque myprogramdi ricevere SIGUSR1 ma la shell eseguirà quindi echoil trapcomando.
trap '' SIGUSR1; gvimdiff file1 file2e Vim è morto con "Vim: Caught deadly signal USR1".