Faça o bloco tmux até que o programa seja concluído

8

Estou impressionado com os recursos de controle remoto do tmux:

tmux new-window -t p12346 'echo foo;sleep 10' 

Isso cria uma nova janela na sessão denominada p12346 e não imprime nada na tela. Isso é ótimo. Mas como posso dizer ao comando acima que aguarde até que o sono termine antes de retornar? Ou seja, eu quero fazer o mesmo, mas levar 10 segundos para executar:

time tmux new-window -t p12346 'echo foo;sleep 10' 

fundo

Se isso for viável, poderá se tornar um recurso do GNU Parallel: Os trabalhos atualmente em execução podem ser acessados ​​a cada janela tmux, para que você possa acompanhar o progresso de cada trabalho em tempo real.

Portanto tmux, não será executado em primeiro plano: o usuário precisará se conectar a ele.

Ole Tange
fonte

Respostas:

8

O tmux 1.8 introduziu o wait-forcomando que pode ajudar a fazer o que você deseja:

time tmux new-window -t p12346 'echo foo;sleep 10;tmux wait-for -S p12346-neww-done' \; \
          wait-for p12346-neww-done

O nome do "canal" ( p12346-neww-doneno exemplo acima) pode ser o que você quiser (desde que seja o mesmo nos dois lugares; se você antecipar várias invocações potencialmente simultâneas, provavelmente também desejará usar um valor exclusivo para cada invocação ) A parte importante é que você "espera" o sinal após o new-windowcomando (como parte do mesmo comando tmux , portanto, o ponto-e-vírgula escapado: tmux precisa processá-lo, não o shell) e envia o sinal como a última etapa do comando da janela.

Se você precisar ser um pouco mais robusto em relação à interrupção de comandos de maneira feia ou inconveniente, tente usar uma armadilha de shell para enviar o sinal (reorganizado um pouco para facilitar a leitura (?)):

time \
tmux new-window -t p12346 '
       trap "tmux wait-for -S p12346-neww-done" 0
       echo foo
       sleep 10
       ' \; wait-for p12346-neww-done
Chris Johnsen
fonte