Faz o bloco tmux até que o programa seja concluído

7

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 para esperar até que o sono termine antes de retornar? Ou seja Eu quero que isso faça o mesmo, mas demore 10 segundos para executar:

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

Plano de fundo

Se isso for viável, ele pode se tornar um recurso do GNU Parallel: as tarefas que estão em execução no momento podem ser acessadas em cada janela do 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.

    
por Ole Tange 16.06.2014 / 17:13

1 resposta

6

tmux 1.8 introduziu o comando wait-for que pode ajudar você a fazer o que quiser:

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-done no exemplo acima) pode ser o que você quiser (desde que seja o mesmo em ambos os lugares; se você prevê várias invocações potencialmente simultâneas, provavelmente também desejará usar um valor único para cada invocação). A parte importante é que você “espera” o sinal após o comando new-window (como parte do mesmo comando tmux , portanto, o ponto e vírgula escapado: tmux precisa processe-o, não o shell) e envie o sinal como o último passo do comando da janela.

Se você precisa ser um pouco mais robusto contra a sua sequência de comandos abortando de uma maneira feia ou inconveniente, então você pode tentar usar uma armadilha shell para enviar o sinal (rearranjado um pouco para legibilidade (?)):

time \
tmux new-window -t p12346 '
       trap "tmux wait-for -S p12346-neww-done" 0
       echo foo
       sleep 10
       ' \; wait-for p12346-neww-done
    
por 17.06.2014 / 09:42

Tags