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

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

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 chamada 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, quero que faça o mesmo, mas leve 10 segundos para ser executado:

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

Fundo

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

Portanto, tmuxnão será executado em primeiro plano: o usuário precisará anexar-se a ele.

Responder1

tmux1.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 em ambos os lugares; se você antecipar múltiplas invocações potencialmente simultâneas, provavelmente também desejará usar um valor único para cada chamada ). O importante é que você “aguarde” o sinal após o new-windowcomando (como parte do mesmotmuxcomando, portanto o ponto e vírgula escapado:tmuxprecisa processá-lo, não o shell) e enviar o sinal como a última etapa do comando da janela.

Se você precisar ser um pouco mais robusto contra o aborto de sua sequência de comandos de uma 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

Responder2

Você pode achar a seguinte abordagem alternativa mais adequada:

Fora do tmux:

mkfifo fifo && tmux new -d '(echo foo;sleep 3) 9> fifo' && time cat fifo

Dentro do tmux:

mkfifo fifo && tmux new-window '(echo foo;sleep 10) 9> fifo' && cat fifo 

Uma distinção é wait-forque essa abordagem funciona como um interruptor de homem morto: funcionará mesmo que, por algum motivo, o wait-for -Scomando nunca seja executado.

Outra distinção é que isso aguardará a saída de todos os processos filhos do processo principal (a menos que fechem explicitamente outros descritores de arquivo, o que é comum para programas que tentam se colocar em segundo plano).

Explicação: O catcomando irá esperar até que algo abra a outra extremidade do FIFO e então sairá quandotodosas instâncias desse descritor de arquivo são fechadas, o que acontecerá quando todos os processos que o contêm forem encerrados. O efeito se propaga para processos filhos graças à propriedade dos descritores de arquivo que, por padrão, os processos filhos herdam os descritores de arquivos abertos do pai.

informação relacionada