Gibt es nohup, gibt es einen nousr1 Befehl?

12

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?

user2624632
quelle
3
Die bessere Frage könnte sein, was das usr1-Signal überhaupt sendet. Wenn dies nicht der Fall ist, kann die Beendigungsnachricht einfach irreführend sein.
Grant
2
Hört sich so an, als hätten Sie ernsthafte Probleme mit Ihren "regulären Programmen". Wenn Sie nur die Signale deaktivieren, können die zugrunde liegenden Anwendungen möglicherweise nicht richtig funktionieren. Ich empfehle dringend, dass Sie Ihre Umgebung SORGFÄLTIG untersuchen, bevor Sie nur Dinge deaktivieren.
mdpc
@Grant: Ich stimme zu. Gibt es ein Dienstprogramm, das mir sagt, was diese Signale sendet?
user2624632

Antworten:

3

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.

Ruslan
quelle
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.
Simon Richter
@SimonRichter Wenn Sie den 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.
Ruslan
Das scheint gut zu funktionieren.
user2624632
8

Wie wäre es mit dem trapeingebauten Shell -Befehl?

trap 'echo "Thou shalt not USR1 me"' USR1 
Janne Pikkarainen
quelle
Gute Idee, aber es hat nicht funktioniert. Der Vorgang wurde trotzdem mit "Benutzerdefiniertes Signal 1" beendet.
user2624632
Signalhandler (außer SIG_IGN und SIG_DFL) werden nicht von untergeordneten Prozessen geerbt.
Aecolley
2

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 .

Adrian Pronk
quelle
Das scheint gut zu funktionieren.
user2624632
Hoppla, ich habe zu früh gesprochen. Ich rannte trap '' SIGUSR1; gvimdiff file1 file2und Vim starb mit "Vim: Gefangenes tödliches Signal USR1".
user2624632
Hmmm, im Quellcode unter code.google.com/p/vim/source/browse/src/os_unix.c scheint VIM das USR1-Signal wieder zu aktivieren und es als schwerwiegenden Fehler zu behandeln. Ihre einzige Hoffnung scheint zu sein, wenn Sie das Betriebssystem dazu bringen können, die Abgabe des USR1-Signals zu verweigern. Ich weiß nicht, ob es da draußen etwas gibt, das diese Funktionalität bietet.
Adrian Pronk
Weitere Informationen hier: stackoverflow.com/q/4515274/41861
Adrian Pronk
Adrian Pronk: Es ist nicht nur Vim; Es ist auch Firefox und Aqualung und Thunderbird und einige andere. Aber nicht andere Apps wie Konsole, die für immer laufen.
user2624632