Haga que tmux bloquee hasta que se complete el programa

Haga que tmux bloquee hasta que se complete el programa

Estoy impresionado con 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 denominada 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' 

Fondo

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

Por lo tanto, tmuxno se ejecutará en primer plano: el usuario deberá adjuntarlo.

Respuesta1

tmux1.8 introdujo el wait-forcomando que puede ayudarle a hacer lo que desea:

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 el que desee (siempre que sea el mismo en ambos lugares; si prevé múltiples invocaciones potencialmente simultáneas, probablemente también querrá usar un valor único para cada invocación). ). La parte importante es que "esperas" la señal después del new-windowcomando (como parte del mismotmuxcomando, por lo tanto el punto y coma escapado:tmuxnecesita procesarlo, no el shell) y enviar la señal como último paso del comando de la ventana.

Si necesita ser un poco más robusto contra la cancelación de su secuencia de comandos de una manera fea o inconveniente, entonces puede intentar usar una trampa de shell para enviar la señal (reorganizada 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

Respuesta2

Puede que le resulte más adecuado el siguiente enfoque alternativo:

Fuera de tmux:

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

Dentro de tmux:

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

Una diferencia es wait-forque este enfoque funciona como un interruptor de hombre muerto: funcionará incluso si, por alguna razón, el wait-for -Scomando nunca llega a ejecutarse.

Otra distinción es que esto esperará a que salgan todos los procesos secundarios del proceso principal (a menos que cierren explícitamente otros descriptores de archivos, lo cual es común para los programas que intentan ponerse en segundo plano).

Explicación: El catcomando esperará hasta que algo abra el otro extremo del FIFO y luego saldrá cuandotodoLas instancias de ese descriptor de archivo se cierran, lo que sucederá cuando todos los procesos que lo contienen salgan. El efecto se propaga a los procesos secundarios gracias a la propiedad de los descriptores de archivos de que, de forma predeterminada, los procesos secundarios heredan los descriptores de archivos abiertos del padre.

información relacionada