/ / Tmux im Bash-Skript, das zu schnell ausgef├╝hrt wird - Linux, Bash, SSH, Terminal, tmux

Tmux im Bash-Skript, das zu schnell ausgef├╝hrt wird - Linux, Bash, SSH, Terminal, tmux

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

  • 8 tmux terminals ├Âffnen
  • Jedes der Terminals verbindet sich in ssh mit einem Remote-Server
  • starte ein script X auf 3 server und wenn es fertig ist
  • Starten Sie ein anderes Skript Y auf 3 verschiedenen Servern

Die Operationen (insbesondere die letzten beiden) m├╝ssen seingenau in dieser Reihenfolge ausgef├╝hrt. Ich habe es geschafft, alle tmux-Terminals zu erstellen, aber ich sehe, dass tmux aus bestimmten Gr├╝nden so schnell Befehle ausf├╝hrt, dass es nicht auf den Abschluss des Befehls wartet.

Zum Beispiel nur schreiben:

tmux send-keys -t 0 "ls"

im Skript nicht immer die vollst├Ąndige Liste der Dateien im Home-Ordner erstellen.

Dasselbe passiert mit den beiden Skripten auf verschiedenen Servern, manchmal wird Y vor X ausgef├╝hrt.

Das ist mein Drehbuch:

######################################
# 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 ${port[$i]}" 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 ${servers_ips[${i}-3]}" C-m
done

Aktualisieren

Wie kann ich auch warten, bis ein Befehl im selben tmux-Bereich ausgef├╝hrt wird? Als w├╝rde man etwas anderes nur tun, nachdem ein langer Befehl ausgef├╝hrt wurde

Danke im Voraus.

Antworten:

0 f├╝r Antwort Ôäľ 1

Wenn Sie wirklich tmux und Ihre Befehle verwenden m├╝ssennicht interaktiv sind, k├Ânnen Sie dem ersten Befehl einen zweiten Befehl hinzuf├╝gen, der irgendwie signalisiert, dass der erste Befehl beendet wurde. Eine einfache M├Âglichkeit, dies mit einem eingebauten tmux-Befehl zu tun, ist wait-for mit der Option -L channel zu sperren, und -U channel Aufschlie├čen. Sie k├Ânnen viele beliebige Kan├Ąle haben. Wenn Sie einen Kanal sperren, werden weitere Sperrversuche blockiert, bis die Sperre aufgehoben wird.

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 5 zur Muschel, unmittelbar gefolgt von der tmux wait-for Shell-Befehl entsperren, versucht dann, die Sperre erneut abzurufen, sodass sie blockiert wird.

Nach 5 Sekunden ist der Ruhezustand beendet, die Shell f├╝hrt das Entsperren von tmux aus, und jetzt kann die Sperre aufgehoben werden. Erst dann kehrt der obige Befehl tmux zur├╝ck.

Um wieder normal zu werden, a wait-for -U sollte jetzt geschehen, vielleicht durch Ausstellung eines anderen send-keys ... wait-for -U ... kombinierter Befehl wie oben.