Wie führt man einen Bereinigungsbefehl auf dem tmux-Server / Sitzungsexit aus?

2268
Wolph

Um meinen Workflow ein wenig zu verbessern, habe ich ein paar Wrapper-Skripts geschrieben, mit denen automatisch Befehle gestartet werden, wenn ich an einem Projekt arbeiten möchte. Wenn ich jedoch fertig bin und alle tmux-Registerkarten für diese bestimmte Sitzung bereinigt, möchte ich einige Prozesse beenden und einige Dateien bereinigen.

Gibt es eine Möglichkeit, einen Befehl beim Beenden des tmux-Servers automatisch auszuführen?

Der gewünschte Workflow:

  • Befehl ausführen, um einen neuen tmux-Server zu erstellen, einige Dateien zu öffnen, einige Apps zu starten
  • Arbeit in der Sitzung
  • Trennen Sie später, um daran zu arbeiten
  • wieder anbringen
  • Wenn alle Registerkarten auf dem tmux-Server geschlossen und der Server zerstört ist, führen Sie einen Bereinigungsbefehl aus

[edit] Das Skript, das ich derzeit verwende: https://github.com/WoLpH/dotfiles/blob/master/bin/tmx

4
Mit "Bereinigungsbefehl" meinen Sie einen serverspezifischen Befehl? Beispielsweise haben Sie eine Sitzung für Projekt A und eine weitere Sitzung für Projekt B geöffnet. Sie möchten also cleanup_A ausführen, wenn session_A geschlossen ist? Oder meinst du etwas anderes? scicalculator vor 11 Jahren 0
Ja, genau das meine ich. Aber auch ein allgemeiner Bereinigungsbefehl kann funktionieren. Ich kann das zuvor geöffnete Projekt leicht aus den verbleibenden Dateien ableiten. Ich brauche nur einen Post-Server-Exit-Trigger, damit ich einige Dinge aushängen kann. Wolph vor 11 Jahren 0
Ich habe ein Befehlszeilendienstprogramm für das Scripting von tmux-Session-Setup / -Teardown geschrieben: https://github.com/tarruda/tmuxer. Es enthält sogar einen Ersatz für "select-session", mit dem Sie "geschlossene" Sitzungen auswählen können Thiago de Arruda vor 11 Jahren 0
@ThiadodeArruda: das sieht cool aus, ich werde es bald testen. Derzeit verwende ich dieses Skript: https://github.com/WoLpH/dotfiles/blob/master/bin/tmx Wolph vor 11 Jahren 0
@Wolph: Ich habe meine Lösung auch in ein dotfiles-zsh-Skript integriert. Vor kurzem habe ich sie in einen wiederverwendbaren Satz von posix-kompatiblen Shell-Skripten extrahiert, um die Portabilität zu verbessern und die Wiederverwendung durch andere zu vereinfachen Thiago de Arruda vor 11 Jahren 0
Übrigens, wenn Sie tmuxinator verwenden, können Sie einfach einen `post`-Befehl in Ihre Konfigurationsdatei einfügen. Valentin Waeselynck vor 9 Jahren 0
@ValentinWaeselynck: das wäre in der Tat eine schöne Alternative. Für mich ist es nicht wirklich geeignet, da ich regelmäßig auf (veralteten) Servern arbeite, auf denen ich sehr wenig Software-Support habe und tmuxinator zu viele Abhängigkeiten zur Installation hat. Wolph vor 9 Jahren 0

1 Antwort auf die Frage

6
scicalculator

Im Moment gibt es keine spezielle Möglichkeit, dass tmux automatisch Befehle ausführt, die von detachallen Fenstern in der Sitzung ausgelöst oder geschlossen werden. Da Sie jedoch bereits über ein Wrapper-Skript verfügen (ich werde das so nennen tmux_wrapper), das die gewünschte benutzerdefinierte Sitzung öffnet, können Sie dieses Skript leicht konvertieren, um die Bereinigung zu automatisieren. Ich mache etwas ganz ähnlich wie dies ich hier, wo ich verschachtelte tmux Sitzungen ermöglichen wollte, wenn ich durch ssh bin Befestigung.

Da Sie eine benutzerdefinierte Erfahrung im Sinn haben, benötigen Sie nicht mehr die tmux attach ....oder ähnliche Befehle. Daher gehe ich davon aus, dass Sie die Sitzung für Projekt A immer mit etwas beginnen tmux_wrapper A. In Ihrem Wrapper haben Sie wahrscheinlich eine ähnliche Zeile tmux new-session -s A. Hier können wir den Sitzungsnamen nutzen A. Am Ende Ihres Wrappers können Sie dann einen Bereinigungsschalter verwenden, der nur aktiviert wird, wenn die Sitzung nicht mehr live ist (dh Fenster / Fenster sind nicht mehr anfügbar).

Ein einfaches Beispiel tmux_wrapperwürde ungefähr so ​​aussehen:

#!/bin/sh  sess=$1  # test if the session has windows is_closed(){  n=$(tmux ls 2> /dev/null | grep "^$sess" | wc -l) [[ $n -eq 0 ]] }  # either create it or attach to it if is_closed ; then tmux new -s $sess else tmux attach -t $sess fi  # the session is now either closed or detatched if is_closed ; then # perform cleanup here ... fi 

Führe es so aus tmux_wrapper A. Jetzt wird die Bereinigung für Sitzung A automatisch und nur dann ausgeführt, wenn die Sitzung vollständig geschlossen wurde.

Nicht die schönste Lösung, aber es sollte funktionieren :) Danke! Ich habe zwar ein ähnliches Skript, das Sie hier finden, wenn Sie interessiert sind: https://gist.github.com/WoLpH/3163775 Wolph vor 11 Jahren 0