Я пытаюсь написать скрипт bash, который выполняет следующие действия:

  • открыть 8 терминалов Tmux
  • каждый из терминалов подключается в SSH к удаленному серверу
  • запустить скрипт X на 3 сервере, и когда это будет сделано
  • запустить другой скрипт Y на 3 разных серверах

Операции (особенно последние две) должны выполняться в этом точном порядке. Мне удалось создать все терминалы tmux, но я вижу, что по каким-то причинам tmux настолько быстро выполняет команды, что не ожидает завершения команды.

Например, просто написать:

tmux send-keys -t 0 "ls" 

В скрипте не всегда выдают полный список файлов, содержащихся в домашней папке.

То же самое происходит с двумя сценариями на разных серверах, иногда он выполняет Y до X.

Это мой сценарий:

######################################
# 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

Обновить

Кроме того, как я могу ждать завершения команды в той же панели tmux? Как делать что-то еще только после выполнения длинной команды

Заранее спасибо.

1 ответ1

0

Если вам действительно нужно использовать tmux, а ваши команды не являются интерактивными, то вы можете добавить вторую команду к первой команде, которая каким-то образом сигнализирует о завершении первой команды. Простым способом сделать это с помощью встроенной команды tmux является wait-for с опцией -L channel для блокировки и -U channel для разблокировки. Вы можете иметь много произвольных каналов. Когда вы блокируете канал, дальнейшие попытки заблокировать блокируют до разблокировки.

Вот пример:

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

Это блокирует канал my1 , отправляет команду sleep 5 в оболочку, после чего сразу же следует команда оболочки ожидания разблокировки tmux wait-for , затем пытается снова получить блокировку, поэтому она блокируется.

Через 5 секунд сон завершается, оболочка выполняет разблокировку tmux, и теперь блокировка может быть снята, и только после этого возвращается вышеприведенная команда tmux.

Чтобы вернуться в нормальное состояние, теперь нужно выполнить wait-for -U , возможно, выполнив другую комбинированную команду send-keys ... wait-for -U ... как описано выше.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .