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
nohup
Verhindert, dass der Prozess ein SIGHUP
Signal empfängt , während STRG + C ein SIGINT
Signal sendet . Deshalb hat nohup
es nicht den erwarteten Effekt.
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?