Wie kann man Bash-Shell-Prozesse remote beenden, aber sicherstellen, dass der Verlauf gespeichert wird?

458
meowsqueak

Gelegentlich kommt mein X11 Window Manager (i3) zum Stillstand, und ich bin gezwungen, zu einer virtuellen Linux-Konsole oder SSH auf meinem Computer zu wechseln, um die Kontrolle wiederzuerlangen.

Normalerweise geschieht dies, wenn ich zahlreiche Rxvt-Fenster geöffnet habe, von denen jedes eine Bash-Shell mit zehn oder gar hunderten Zeilen nützlicher Befehlszeilengeschichte ausführt, die über viele Tage oder Wochen gesammelt wurden.

Ich benutze shopt -s histappendalso, dass jede Bash-Shell ihren Verlauf an die Verlaufsdatei anfügt, wenn sie ordnungsgemäß beendet wird. Normalerweise funktioniert das sehr gut und es wird meine gesamte Geschichte beibehalten, vorausgesetzt, ich schließe jede Hülle sauber mit exitSTRG-D.

Wenn mein Fenstermanager gesperrt ist, kann ich meine bash-Sitzungen nicht sauber beenden, da ich nicht mit ihnen interagieren kann. Ich habe also versucht, einen Weg zu finden, _remotely_ eine bash-Shell auf eine Weise zu beenden, die dazu führt, dass sie ihre Historie in die History-Datei schreibt.

Ich habe versucht, zahlreiche Signale zu senden, darunter SIGHUPsowohl an den Bash-Shell-Prozess als auch an den enthaltenden RXVT-Prozess.

Ich habe versucht, i3 neu zu starten, aber aus verschiedenen Gründen funktioniert das nicht (gebrochener RPC-Sockel). Durch das Töten des Fenstermanagers werden alle Fenster und Bash-Shells geschlossen, und ich verliere die Geschichte von allen.

Ich habe versucht, einen Weg zu finden, "CTRL-D" in jede Shell zu injizieren stdin, aber soweit ich das beurteilen kann, ist das nicht möglich.

Ich kenne Möglichkeiten, wie bash das Speichern des Verlaufs in die Verlaufsdatei nach jedem Befehl ausführen kann, aber ich ziehe es vor, diese nicht zu verwenden, da sie die Verlaufsindizes durcheinander bringen (dh sie !nnnfunktionieren nicht, da sie nnnnach jedem Befehl geändert werden).

Gibt es eine Möglichkeit, dies zu tun und meine wertvolle Geschichte aus einem gewissen Vergessen zu retten?

0

1 Antwort auf die Frage

1
Kamil Maciorowski

Verwenden reptyr.

reptyr ist ein Dienstprogramm, um ein vorhandenes laufendes Programm zu nehmen und an ein neues Terminal anzuschließen.

Siehe meine Antwort für Details. Nachdem Sie den gewünschten Shell-Prozess an Ihr aktuelles Terminal angehängt haben, können Sie ihn exitordnungsgemäß anweisen.

Es kann jedoch nicht leicht sein, den bestimmten Shell-Prozess zu identifizieren, den Sie im Moment anfügen möchten. Sie werden wahrscheinlich verwenden reptyrauf jedem Shell - Prozess durch gefunden ps(oder ein ähnliches Werkzeug), dann werden Sie vorherige Befehle prüfen und nur dann werden Sie wissen, ob es die gewünschte Sitzung ist oder nicht.

Eine praktischere Lösung ist die Verwendung von tmuxoder screenin erster Linie.

Ich arbeite tmuxtäglich mit und es ist eine triviale Aufgabe, von tty2 wieder anzuhängen. Mit dem Tool brauche ich nicht "zahlreiche Fenster öffnen". Normalerweise organisiere ich meine Arbeit so:

  1. konsoleEinzelfenster.
  2. Eine Registerkarte pro Maschine (lokaler Host direkt, plus ich ssheinige entfernte), tmuxauf jeder.
  3. In jedem tmuxoder mehreren Fenstern (je nach Bedarf).
  4. In jedem Fenster mindestens ein Fenster (je nach Bedarf).

Diese "Layer" sind in der Abbildung unten mit entsprechenden roten Zahlen markiert. X11- oder KDE-Probleme wirken sich nicht auf meine Shell-Sitzungen aus, solange ich zu einer beliebigen Konsole der jeweiligen Maschine gelangen kann. Nur ein Zusammenbruch des tmuxServers selbst kann weh tun, aber ich kann mich nicht erinnern, wann das letzte Mal so etwas passiert ist (wahrscheinlich nie).

Für den Fall, dass "ich gezwungen bin, auf eine virtuelle Linux-Konsole oder SSH auf meinem Computer umzusteigen, um wieder die Kontrolle zu erlangen", brauche tmux aich nur meine Shell-Sitzung (en) zurück, voll funktionsfähig, als ob nichts passiert wäre. Wenn ich meine Fenster - Manager erneut zu laden zwingen kann, dann kann ich nicht einmal brauchen, um diesen Schal Prozesse zu beenden, weil ich zurück, um sie von einem neuen bekommen konsole, rxvtoder jedem Terminal - Emulator.

Bildschirmfoto

Vielen Dank für diese Informationen. "reptyr" ist genau das, was ich brauche. Früher habe ich `screen 'die ganze Zeit benutzt, aber das Copy / Paste- und Scrollback-Verhalten erwies sich als Show-Stopper - macht` tmux` hier einen besseren Job? meowsqueak vor 5 Jahren 0
Übrigens, obwohl ich 'tmux' hätte benutzen können, um meine bash-Sitzungen zu retten, wenn ich sie bereits verwendet hatte, als ich i3 herunterfuhr, stürzte mein gesamter Rechner ab (wahrscheinlich ein Videotreiberproblem), so dass das auch nicht ideal gewesen wäre, wenn ich es getan hätte nicht jede Shell angewiesen, zuerst die Geschichte zu speichern :) meowsqueak vor 5 Jahren 0
@ meowsqueak Ehrlich gesagt weiß ich nicht, ob `tmux` einen besseren Job macht. Ich habe keine Erfahrung mit `screen`, also kein Vergleich; und ich brauche selten von `tmux` zu kopieren. Kamil Maciorowski vor 5 Jahren 0