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, tmux
não será executado em primeiro plano: o usuário precisará anexar-se a ele.
Responder1
tmux1.8 introduziu o wait-for
comando 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-done
no 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-window
comando (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-for
que essa abordagem funciona como um interruptor de homem morto: funcionará mesmo que, por algum motivo, o wait-for -S
comando 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 cat
comando 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.