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, tmux
no se ejecutará en primer plano: el usuario deberá adjuntarlo.
Respuesta1
tmux1.8 introdujo el wait-for
comando 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-done
en 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-window
comando (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-for
que este enfoque funciona como un interruptor de hombre muerto: funcionará incluso si, por alguna razón, el wait-for -S
comando 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 cat
comando 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.