Tmux no script bash executando muito rápido

0

Estou tentando escrever um script bash que executa as seguintes ações:

  • abrir 8 terminais tmux
  • cada um dos terminais se conecta em ssh a um servidor remoto
  • inicie um script X no servidor 3 e quando terminar
  • inicie outro script Y em 3 servidores diferentes

As operações (especialmente as duas últimas) devem ser executadas nesta ordem precisa. Eu consegui criar todos os terminais tmux, mas eu vejo que por alguns motivos o tmux é tão rápido na execução de comandos que ele não espera o comando terminar.

Por exemplo, escrevendo apenas:

tmux send-keys -t 0 "ls" 

no script nem sempre produz a lista completa de arquivos contidos na pasta base.

O mesmo acontece com os dois scripts em servidores diferentes, às vezes executa Y antes do X.

Este é o meu script:

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

Atualizar

Além disso, como posso esperar que um comando seja concluído no mesmo painel tmux? Como fazer outra coisa somente depois de um longo comando ter sido executado

Obrigado antecipadamente.

    
por Ema Esp 13.10.2018 / 18:57

1 resposta

0

Se você realmente precisa usar o tmux, e seus comandos não são interativos, então você pode adicionar um segundo comando ao primeiro comando que sinaliza de alguma forma que o primeiro comando foi concluído. Uma maneira simples de fazer isso usando um comando interno do tmux é wait-for com a opção -L channel para bloquear e -U channel para desbloquear. Você pode ter muitos canais arbitrários. Quando você bloquear um canal, outras tentativas de bloqueio serão bloqueadas até um desbloqueio.

Veja um exemplo:

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

Isso trava o canal my1 , envia o comando sleep 5 para o shell, imediatamente seguido pelo comando tmux wait-for unlock shell, então tenta obter o bloqueio novamente, então ele bloqueia.

Após 5 segundos, o sono termina, o shell executa o destravamento do tmux, e agora o bloqueio pode ser feito, e somente então o comando tmux acima retorna.

Para voltar ao normal, um wait-for -U deve ser feito, talvez pela emissão de outro comando send-keys ... wait-for -U ... combinado como acima.

    
por 13.10.2018 / 20:50