Tmux in Bash-Skript wird zu schnell ausgeführt

362
Ema Esp

Ich versuche, ein Bash-Skript zu schreiben, das die folgenden Aktionen ausführt:

  • 8 Terminals öffnen
  • Jedes der Terminals verbindet sich in SSH mit einem Remote-Server
  • Starten Sie ein Skript X auf 3 Server und wenn es fertig ist
  • Starten Sie ein weiteres Skript Y in 3 verschiedenen Servern

Die Operationen (insbesondere die letzten beiden) müssen in dieser genauen Reihenfolge ausgeführt werden. Ich habe es geschafft, alle tmux-Terminals zu erstellen, aber ich sehe, dass tmux aus bestimmten Gründen Befehle so schnell ausführt, dass der Befehl nicht gewartet wird.

Zum Beispiel schreiben Sie einfach:

tmux send-keys -t 0 "ls" 

Im Skript wird nicht immer die vollständige Liste der im Ausgangsordner enthaltenen Dateien erstellt.

Dasselbe passiert mit den beiden Skripts auf verschiedenen Servern, manchmal führt sie Y vor X aus.

Das ist mein Skript:

###################################### # Setup tmux ###################################### tmux new-session -d -s sss tmux new-window -t sss  for (( i = 0; i < 3; i++ )); do tmux split tmux select-layout even-vertical done  for (( i = 0; i < 8; i=i+2 )); do tmux select-pane -t $i tmux split-window -h done ######################################     ###################################### # Ssh Connection ###################################### for (( i = 0; i < 8; i++ )); do tmux send-keys -t $i "$connection $" C-m done ######################################   for (( i = 0; i < 3; i++ )); do tmux send-keys -t $i "cd scripts" C-m tmux send-keys -t $i "./X.sh" C-m done  for (( i = 3; i < 6; i++ )); do tmux send-keys -t $i "cd scripts" C-m tmux send-keys -t $i "./Y.sh $-3]}" C-m done 

Aktualisieren

Wie kann ich auch darauf warten, dass ein Befehl im selben TMux-Bereich beendet wird? Zum Beispiel etwas anderes tun, nachdem ein langer Befehl ausgeführt wurde

Danke im Voraus.

0

1 Antwort auf die Frage

0
meuh

Wenn Sie wirklich tmux verwenden müssen und Ihre Befehle nicht interaktiv sind, können Sie dem ersten Befehl einen zweiten Befehl hinzufügen, der auf irgendeine Weise signalisiert, dass der erste Befehl abgeschlossen ist. Eine einfache Möglichkeit, dies mit einem integrierten tmux-Befehl auszuführen, ist wait-fordie Option -L channelzum Sperren und -U channelEntsperren. Sie können viele beliebige Kanäle haben. Wenn Sie einen Kanal sperren, werden weitere Sperrversuche bis zum Entsperren blockiert.

Hier ist ein Beispiel:

tmux wait-for -L my1\; \ send-keys 'sleep 5' Enter 'tmux wait-for -U my1' Enter\; \ wait-for -L my1 

Dies sperrt den Kanal my1, sendet den Befehl sleep 5an die Shell, unmittelbar gefolgt vom tmux wait-forShell-Befehl zum Entsperren, und versucht dann, die Sperre erneut zu erhalten, sodass er blockiert.

Nach 5 Sekunden ist der Schlaf beendet, die Shell führt die Tmux-Sperre aus, und jetzt kann die Sperre aufgehoben werden. Erst dann kehrt der obige Tmux-Befehl zurück.

Um wieder zur Normalität zurückzukehren, wait-for -Usollten Sie jetzt einen send-keys ... wait-for -U ...Befehl ausführen, indem Sie wie oben beschrieben einen anderen kombinierten Befehl ausgeben .

Vielen Dank! Ich werde Ihren Vorschlag so bald wie möglich versuchen. In der Zwischenzeit denke ich auch, dass ich tmux nicht wirklich brauche ... In wenigen Worten muss ich einige Befehle an verschiedene Remote-Server senden, um die Leistung zu messen, zu warten, bis jeder Rechner fertig ist, und neue Experimente ausstellen. Irgendwelche Vorschläge, wie man das am besten macht? Ema Esp vor 6 Jahren 0
Sie können es wahrscheinlich einfach halten, indem Sie jeden Befehl innerhalb seiner eigenen ssh ausgeben, anstatt sich mit ssh anzumelden und dann Befehle über diese Verbindung senden zu müssen. Dies ist einfacher, wenn das Kennwort ohne Kennwort verwendet wird, dh die Authentifizierung mit öffentlichen Schlüsseln. meuh vor 6 Jahren 0
Du hast recht, das habe ich getan. Ich werde die Frage als gelöst markieren. Vielen Dank Ema Esp vor 6 Jahren 0