Ich wusste nicht, ob dies zu SO gehört (da es sich um einen Programmierfehler handelt), aber ich dachte, ihr wisst mehr über die Feinheiten der verwendeten Software Bescheid (also könnte vielleicht sogar U & L in Betracht gezogen werden).
Hier ist das minimale Codeskript (siehe Änderungen für das vollständige Skript, es gibt einen Grund, warum ich es so mache);
#/bin/bash
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log
Es wird versucht, einen Server im Hintergrund auszuführen, der in eine Protokolldatei ausgegeben wird.
Dann habe ich follow
diese Logdatei benutzt less +F
. Wenn Sie dies beenden möchten, müssen Sie ctrl+ drückenc bevor Sie drücken können Q.
Was passiert, ist, wenn ich ctrl+ cinnerhalb des less
Befehls (zum Stoppen tailing
) den Server, mit nohup
dem oben begonnen wurde, irgendwie töte ! Sonst ist nichts betroffen. Ich kann shift+f beginnen, das Protokoll erneut zu verfolgen (das keine neuen Informationen erhält, da der Server beendet wird), und wenn ich Qden Rest des Skripts drücke, wird es normal ausgeführt.
Wissen Sie, warum das passiert? Wie vermeide ich es / etwas anderes, das ich benutzen sollte?
PS:
Das Serverprogramm wartet möglicherweise auf ein ^C
Problem. Kann ich etwas dagegen tun? Wenn ich einfach {SERVERCOMMAND}
alleine renne (blockierend), kann ich ctrl+ drücken c, was es nicht sofort tötet. es druckt Received ^C signal, shutting down
(und tötet sich dann selbst). Dies ist, was passiert, wenn ich ^C
in less
(Ein Finale Received ^C signal, shutting down
wird in das Protokoll geschrieben).
PPS
Ich habe eine Reihe von Dingen ausprobiert (keine hat funktioniert).
versuche das stdin vom script zu trennen indem du es änderst
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 & to nohup echo '' | {SERVERCOMMAND} > currentOutput.log 2>&1 & or nohup cat /dev/null/ | {SERVERCOMMAND} > currentOutput.log 2>&1 &
Verwenden Sie
stty intr ^G
, um den Interrupt-Befehl zu ersetzen, aber dann hat ctrl+ ggenau das getan, was^C
ohnehin getan wurde (daher kann dies ein Problem mit meinem Terminal-Emulator sein;konsole
)Platzieren des
nohup
& / oder desless
Linie in Klammern (um daraus eine Unterschale zu machen)Ausführen des Skripts in
xterm
anstelle vonkonsole
I think it is due to the handling within the database software, not on the shell
. Wie würde ein Programm das machen? Wie könnte ich dann damit aufhören?nohup
Verhindert, dass der Prozess einSIGHUP
Signal empfängt , während STRG + C einSIGINT
Signal sendet . Deshalb hatnohup
es nicht den erwarteten Effekt.Antworten:
Ich dachte zu Recht, dass es
SIGINT
zu allen Prozessen gesendet wird, wenn ctrl+ c, aber ich dachte dumm, dass das Herstellen eines anderen Prozesses es außerhalb des bringen würdeprocess group
(siehe meine Versuche in derP.P.S.
).Dies ist nicht nur der genaue Anwendungsfall, sondern auch die richtige Lösung.
Aufgrund der Struktur meines Skripts passte die Antwort dort nicht wörtlich, dies ist jetzt das Skript.
Der Server weiter in die Protokolldatei , nachdem ich die Ausgabe ctrl+ cin
less
.Vielen Dank für die Zeit aller.
quelle
Hast du es mit Ablehnung versucht ?
oder was auch immer Ihr Job ist; disown ist eine eingebaute Shell, deren Manpage lautet:
BEARBEITEN
Lustige Sache, deine Konstruktion läuft auf meinem Arch Linux:
Vor dem ps Befehl hatte ich die out.log Datei zu blättern, dann Ctrl+C, dann q.
quelle
nohup
Zeile in einer Funktion zu platzieren, diedisowns
selbst, aber das sollte das gleiche sein wienohup
. Ich glaube nicht, dass dies einSIGHUP
Problem ist. Wenn ich dieless
Zeile entferne , wird das Skript geschlossen , während der Server noch ausgeführt wird