Haga el bloque tmux hasta que el programa se complete

8

Estoy impresionado por las funciones de control remoto de tmux:

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

Esto crea una nueva ventana en la sesión llamada p12346 y no imprime nada en la pantalla. Eso es genial Pero, ¿cómo puedo decirle al comando anterior que espere hasta que termine el sueño antes de regresar? Es decir, quiero que esto haga lo mismo pero que tarde 10 segundos en ejecutarse:

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

Antecedentes

Si esto es viable, entonces podría convertirse en una característica de GNU Parallel: se puede acceder a los trabajos que se ejecutan actualmente en cada ventana tmux, para que pueda seguir el progreso de cada trabajo en tiempo real.

Por tmuxlo tanto , no se ejecutará en primer plano: el usuario deberá adjuntarlo.

Ole Tange
fuente

Respuestas:

8

tmux 1.8 introdujo el wait-forcomando que puede ayudar a hacer lo que quieras:

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

El nombre del "canal" ( p12346-neww-doneen el ejemplo anterior) puede ser lo que desee (siempre que sea el mismo en ambos lugares; si anticipa múltiples invocaciones potencialmente simultáneas, entonces probablemente también desee utilizar un valor único para cada invocación ) La parte importante es que "espere" la señal después del new-windowcomando (como parte del mismo comando tmux , por lo tanto, el punto y coma escapado: tmux necesita procesarlo, no el shell) y enviar la señal como el último paso de El comando de la ventana.

Si necesita ser un poco más robusto contra su secuencia de comandos, abortando de una manera fea o inconveniente, entonces puede intentar usar una trampa de shell para enviar la señal (reorganizado un poco para facilitar la lectura (?)):

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
fuente