Einige meiner regulären Programme stürzen (regelmäßig) mit der Meldung "Benutzerdefiniertes Signal 1" ab. Ich weiß, dass es einen nohupBefehl gibt, aber gibt es einen nousr1Befehl? Oder etwas was sowas nohupaber mit USR1 machen wird?
Einige meiner regulären Programme stürzen (regelmäßig) mit der Meldung "Benutzerdefiniertes Signal 1" ab. Ich weiß, dass es einen nohupBefehl gibt, aber gibt es einen nousr1Befehl? Oder etwas was sowas nohupaber mit USR1 machen wird?
Antworten:
Eine einfache Hacky-Lösung, um das Dienstprogramm analog zu haben nohup, aber für SIGUSR1, wäre, eine Kopie der coreutils- Quelle zu bekommen , sie zu entpacken, zu tun
sed -i 's/SIGHUP/SIGUSR1/' /path/to/coreutils/src/nohup.c
, optional auch den Namen der Ausgabedatei ändern
sed -i 's/nohup\.out/nousr1.out/g' /path/to/coreutils/src/nohup.c
Kompilieren Sie diese Quelle und installieren Sie die neu kompilierte nohupBinärdatei unter /usr/bin/nousr1:
cp /path/to/coreutils/src/nohup /usr/bin/nousr1
Danach, wie ich überprüft habe, sleep 1000geht es weiter USR1, während nousr1 sleep 1000es immun gegen dieses Signal ist.
nohupÜbrigens besteht die Hauptfunktionalität darin , den Prozess vom Terminal zu trennen, damit er nicht an SIGHUPerster Stelle gesendet wird . Dass es auch einen Signal-Handler einrichtet, ist ein zusätzlicher Bonus, sollte aber unnötig sein.
signal(SIGHUP,SIG_IGN);Anruf entfernen nohup.c, erhält der Prozess die SIGHUP. Was nohuptut außer das Signal ignoriert wird Wiedereröffnung nur die stdin, stdout, stderr Deskriptoren als Nicht-Terminal - Dateien. Es trennt den Prozess in keiner besonderen Weise vom Terminal. Dh der Prozess wird gesendet, SIGHUPwenn das Terminal auflegt. Auf der anderen Seite gibt es Bash, das mit Befehlen vergleichbar ist disown, aber ich bin nicht sicher, wie es implementiert wird - vielleicht so, wie Sie es meinen.
Wie wäre es mit dem trapeingebauten Shell -Befehl?
trap 'echo "Thou shalt not USR1 me"' USR1
Sie müssen die Form des trapBefehls mit einem leeren Argument verwenden. Versuche dies:
trap '' SIGUSR1; myprogram
Dadurch wird das SIGUSR1-Signal ignoriert . Obwohl ich den Kommentatoren zustimme, dass hier wahrscheinlich mehr los ist, als man denkt.
Die falsche Form:
trap 'echo ...' SIGUSR1; myprogram
erlaubt weiterhin den myprogramEmpfang von SIGUSR1, die Shell führt dann jedoch echoden trapBefehl from aus .
trap '' SIGUSR1; gvimdiff file1 file2und Vim starb mit "Vim: Gefangenes tödliches Signal USR1".