Strg + c in einem Unterprozess beendet einen nicht aktualisierten Prozess weiter oben im Skript

15

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 followdiese 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 lessBefehls (zum Stoppen tailing) den Server, mit nohupdem 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 ^CProblem. 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 ^Cin less(Ein Finale Received ^C signal, shutting downwird 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 ^Cohnehin 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 xtermanstelle vonkonsole

Hashbrown
quelle
Möglicherweise ist jemand auf mein Problem gestoßen. 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?
Hashbrown
3
nohupVerhindert, dass der Prozess ein SIGHUPSignal empfängt , während STRG + C ein SIGINTSignal sendet . Deshalb hat nohupes nicht den erwarteten Effekt.
Piotr Dobrogost

Antworten:

11

Ich dachte zu Recht, dass es SIGINTzu allen Prozessen gesendet wird, wenn ctrl+ c, aber ich dachte dumm, dass das Herstellen eines anderen Prozesses es außerhalb des bringen würde process 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.

#/bin/bash

setsid {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log

Der Server weiter in die Protokolldatei , nachdem ich die Ausgabe ctrl+ cinless .

Vielen Dank für die Zeit aller.

Hashbrown
quelle
0

Hast du es mit Ablehnung versucht ?

  disown -h %1

oder was auch immer Ihr Job ist; disown ist eine eingebaute Shell, deren Manpage lautet:

verleugnen

disown [-ar] [-h] [jobspec ...]

Ohne Optionen wird jede Jobspezifikation aus der Tabelle der aktiven Jobs entfernt. Wenn die Option -h' option is given, the job is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If jobspec is not present, and neither the-a 'noch -r' option is supplied, the current job is used. If no jobspec is supplied, the-a' bedeutet, dass alle Jobs entfernt oder markiert werden sollen; Die Option -r ohne Jobspec-Argument beschränkt die Ausführung von Jobs.

BEARBEITEN

Lustige Sache, deine Konstruktion läuft auf meinem Arch Linux:

 $ cat testm
  #!/bin/sh

  nohup /home/mario/temp/waste & 

  less +F out.log

 $ cat waste
  #!/bin/sh

  while [ 1 ]; do
    find / -print 2>1 1> out.log
  done
  $ ./testm
   nohup: appending output to nohup.out
  $ ps ax | grep waste
    19090 pts/2    S      0:00 /bin/sh /home/mario/temp/waste
    19124 pts/2    S+     0:00 grep waste]
  $

Vor dem ps Befehl hatte ich die out.log Datei zu blättern, dann Ctrl+C, dann q.

MariusMatutiae
quelle
Ja, aber ich weiß nicht, wie ich es anwenden soll. Ich habe versucht, die nohupZeile in einer Funktion zu platzieren, die disownsselbst, aber das sollte das gleiche sein wie nohup. Ich glaube nicht, dass dies ein SIGHUPProblem ist. Wenn ich die lessZeile entferne , wird das Skript geschlossen , während der Server noch ausgeführt wird
Hashbrown,
@Hashbrown pls siehe meine Bearbeitung
MariusMatutiae
Ja, ich habe auch einen Test durchgeführt, bei dem ein einfaches Bash-Skript anstelle der ausführbaren Datei {SERVER} aufgerufen wurde. Und nohup hat einfach gut funktioniert. Siehe meinen Kommentar zu der Frage. Ich denke, es ist irgendwie zweckmäßig zuzuhören. Da es ein richtiger (und nicht bekannter) Server ist, kann ich nicht einmal sagen, was es ist, damit jemand sagen kann: "Oh, es macht X, du musst Y machen"
Hashbrown