Einige meiner regulären Programme stürzen (regelmäßig) mit der Meldung "Benutzerdefiniertes Signal 1" ab. Ich weiß, dass es einen nohup
Befehl gibt, aber gibt es einen nousr1
Befehl? Oder etwas was sowas nohup
aber mit USR1 machen wird?
12
Antworten:
Eine einfache Hacky-Lösung, um das Dienstprogramm analog zu haben
nohup
, aber fürSIGUSR1
, wäre, eine Kopie der coreutils- Quelle zu bekommen , sie zu entpacken, zu tun, optional auch den Namen der Ausgabedatei ändern
Kompilieren Sie diese Quelle und installieren Sie die neu kompilierte
nohup
Binärdatei unter/usr/bin/nousr1
:Danach, wie ich überprüft habe,
sleep 1000
geht es weiterUSR1
, währendnousr1 sleep 1000
es immun gegen dieses Signal ist.quelle
nohup
Übrigens besteht die Hauptfunktionalität darin , den Prozess vom Terminal zu trennen, damit er nicht anSIGHUP
erster 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 entfernennohup.c
, erhält der Prozess dieSIGHUP
. Wasnohup
tut 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,SIGHUP
wenn das Terminal auflegt. Auf der anderen Seite gibt es Bash, das mit Befehlen vergleichbar istdisown
, aber ich bin nicht sicher, wie es implementiert wird - vielleicht so, wie Sie es meinen.Wie wäre es mit dem
trap
eingebauten Shell -Befehl?quelle
Sie müssen die Form des
trap
Befehls mit einem leeren Argument verwenden. Versuche dies:Dadurch wird das SIGUSR1-Signal ignoriert . Obwohl ich den Kommentatoren zustimme, dass hier wahrscheinlich mehr los ist, als man denkt.
Die falsche Form:
erlaubt weiterhin den
myprogram
Empfang von SIGUSR1, die Shell führt dann jedochecho
dentrap
Befehl from aus .quelle
trap '' SIGUSR1; gvimdiff file1 file2
und Vim starb mit "Vim: Gefangenes tödliches Signal USR1".