¿Cómo ejecutar el código en una nueva sesión tmux, desde la sesión actual?

13

Utilizo Ubuntu 16.04 y necesito la siguiente tmuxsolución porque quiero ejecutar un proceso de tiempo de espera, sleepya que en mi caso particular no estaba satisfecho aty encontré un error con nohup(al combinar nohup-sleep). Ahora, tmuxparece la mejor alternativa, ya que tiene su propio mecanismo de no colgar y en realidad funciona bien en el uso manual (hago la pregunta solo con respecto a la automatización del proceso que ya puedo hacer manualmente con él).

Lo que necesito:

Necesito una forma de hacer las siguientes 3 acciones, todo en una operación:

  1. Adjuntando una nueva tmuxsesión.
  2. Inyectando un conjunto de comandos listo para esa sesión, como (sleep 30m ; rm -rf dir_name ; exit). Preferiría especialmente un conjunto de varias líneas, y no una fila larga.
  3. La ejecución del comando anterior establece el momento en que se terminó de escribir como stdin en la nueva tmuxsesión.

En otras palabras, quiero ejecutar un conjunto de códigos en otra tmuxsesión que se creó especialmente para esa causa, pero hacer todo en una operación.


Notas:

  • Mi objetivo es hacer todo desde mi sesión de trabajo original (la que trabajo la mayor parte del tiempo). En general, no tengo intención de visitar la sesión recién creada, solo quiero crearla con su código ejecutado automáticamente y listo.

  • Si es posible, preferiría una solución heredoc. Creo que es más eficiente.

JohnDoea
fuente

Respuestas:

18

Si coloca el código que desea ejecutar, por ejemplo /opt/my_script.sh, es muy fácil hacer lo que quiere:

tmux new-session -d -s "myTempSession" /opt/my_script.sh

Esto inicia una nueva sesión separada, llamada "myTempSession", ejecutando su script. Luego puede adjuntarlo para ver qué está haciendo, ejecutándolo tmux attach-session -t myTempSession.

Esa es, en mi opinión, la solución más sencilla y elegante. No conozco ninguna forma fácil de ejecutar comandos desde stdin (leer "from heredocs") con tmux. Al hackear, incluso podrías hacerlo, pero aún sería (y parecería) un hack.

Por ejemplo, aquí hay un truco que utiliza el comando que sugerí anteriormente para simular el comportamiento que desea (= ejecutar código en una nueva sesión tmux desde un heredoc. No se produce escritura en el disco duro del servidor, ya que se crea el archivo temporal /dev/shm, que es un tmpfs):

(
  cat >/dev/shm/my_script.sh &&
  chmod +x /dev/shm/my_script.sh &&
  tmux new-session -d '/dev/shm/my_script.sh; rm /dev/shm/my_script.sh'
) <<'EOF'
    echo "hacky, but works"
EOF
Mario Vitale
fuente
1
Querido Mario. Siempre es un placer leer sus respuestas. No estoy seguro si entiendo correctamente, por favor dígame si estoy equivocado: 1.hay dos formas de hacerlo, una implica crear primero un script temporal (que contiene el código) y ejecutarlo con la creación y el segundo es un heredoc camino. 2.Si la segunda forma funciona (cuando cada fila de eco contiene cada fila de código del heredoc), ¿por qué deberíamos ver esto como un hack si es un código válido de Bash? ¿Tal vez porque las filas del heredoc se repiten y no se ejecutan regularmente en heredocs?
JohnDoea
2
@Benia Es un truco ya que solo funciona en algunos sistemas Unix que tienen /dev/shm. También es un truco, ya que es más complicado, difícil de leer, entender y mantener que simplemente escribir el script en un archivo ordinario y comenzar con eso tmux.
Kusalananda
1
Como explicó @Kusalananda, los documentos heredados para la ejecución de código son una mala práctica en general. Aunque feo e imposible de mantener, funciona, pero te obliga a encontrar una forma indirecta de hacer cosas muy simples ... solo compara el primer y el segundo bloque de código en la respuesta: ¿puedes decir cómo funciona? ¿Cuánto tiempo te lleva hacer eso? Es aún más un truco ya que tmux no tiene forma de ejecutar comandos desde stdin (salvo por formas aún más hacky tan feas que ni siquiera lo consideraré), por lo que los scripts externos son la única forma (respuesta a la 1.pregunta) .
Mario Vitale
1
Lo sentimos, hubo un error en la primera muestra (el comando "nueva sesión" no está implícito si usa argumentos). Ahora está arreglado.
Mario Vitale
1
Ahora, cuando lo ejecuto tmux new-session -d -s "myTempSession" /opt/my_script.sh, no abre un archivo temporal para que pueda pegar el código ... Lo que necesito es abrir el script directamente desde la sesión actual, o al menos algo para pasar a la nueva sesión y luego volver directamente al sesión actual. Por cierto, planeo dar recompensas por toda su ayuda, ya que es lo menos que puedo hacer para agradecerles y podría dar recompensas en 11 horas.
JohnDoea