Machen Sie den tmux-Block, bis das Programm abgeschlossen ist

8

Ich bin beeindruckt von den Fernbedienungsfunktionen von tmux:

tmux new-window -t p12346 'echo foo;sleep 10' 

Dadurch wird in der Sitzung ein neues Fenster mit dem Namen p12346 erstellt, und es wird nichts auf dem Bildschirm gedruckt. Das ist großartig. Aber wie kann ich den obigen Befehl anweisen, zu warten, bis der Schlaf beendet ist, bevor ich zurückkehre? Das heißt, ich möchte, dass dies genauso gemacht wird, aber die Ausführung dauert 10 Sekunden:

time tmux new-window -t p12346 'echo foo;sleep 10' 

Hintergrund

Wenn dies möglich ist, wird es möglicherweise zu einer Funktion von GNU Parallel: Auf die aktuell ausgeführten Jobs kann über jedes Fenster zugegriffen werden tmux, sodass Sie den Fortschritt jedes Jobs in Echtzeit verfolgen können.

So tmuxwird nicht im Vordergrund ausgeführt werden: Der Benutzer muss , um es zu befestigen.

Ole Tange
quelle

Antworten:

8

tmux 1.8 hat den wait-forBefehl eingeführt, mit dem Sie tun können, was Sie wollen:

time tmux new-window -t p12346 'echo foo;sleep 10;tmux wait-for -S p12346-neww-done' \; \
          wait-for p12346-neww-done

Der Kanalname ( p12346-neww-doneim obigen Beispiel) kann beliebig sein (solange er an beiden Stellen gleich ist. Wenn Sie mehrere potenziell gleichzeitige Aufrufe erwarten, möchten Sie wahrscheinlich auch für jeden Aufruf einen eindeutigen Wert verwenden ). Der wichtige Teil ist, dass Sie nach dem new-windowBefehl auf das Signal „warten“ (als Teil desselben tmux- Befehls, also das maskierte Semikolon: tmux muss es verarbeiten, nicht die Shell) und das Signal als letzten Schritt von senden der Befehl des Fensters.

Wenn Sie etwas robuster sein müssen, wenn Ihre Befehlssequenz auf hässliche oder unbequeme Weise abgebrochen wird, können Sie versuchen, das Signal mit einer Shell-Trap zu senden (aus Gründen der Lesbarkeit etwas neu angeordnet (?)):

time \
tmux new-window -t p12346 '
       trap "tmux wait-for -S p12346-neww-done" 0
       echo foo
       sleep 10
       ' \; wait-for p12346-neww-done
Chris Johnsen
quelle