Tmux в bash-скрипте выполняется слишком быстро

256
Ema Esp

Я пытаюсь написать скрипт 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 $" 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 

Обновить

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

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

0

1 ответ на вопрос

0
meuh

Если вам действительно нужно использовать 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-forunlock shell, затем пытается снова получить блокировку, поэтому она блокируется.

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

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

Спасибо! Я попробую ваше предложение, как только смогу. В то же время я начинаю думать, что мне действительно не нужен tmux ... В двух словах мне нужно отправить несколько команд на различные удаленные серверы для измерения производительности, дождаться завершения работы каждой машины и выпустить новый набор экспериментов. Любое предложение о лучшем способе сделать это? Ema Esp 5 лет назад 0
Вероятно, вы можете упростить задачу, выполнив каждую команду в своем собственном ssh, вместо того, чтобы войти в систему с помощью ssh, а затем отправлять команды через это соединение. Это проще, используя ssh без пароля, то есть аутентификацию с открытым ключом. meuh 5 лет назад 0
Вы правы, я закончил этим. Я отмечу вопрос как решенный. Спасибо Ema Esp 5 лет назад 0

Похожие вопросы