Redirigir la salida del proceso en segundo plano

Redirigir la salida del proceso en segundo plano

Objetivo: Ejecutar el programa en segundo plano (con un PID), capturar el PID, recopilar la salida y eliminar el PID.

Mi código:

tee -a log | program | tee -a log &
PID=$!
disown $PID
sleep 10
pkill '^program*' 2> /dev/null

Ejecuté una variación de diferentes opciones de redireccionamiento, pero parece que no puedo enviar el resultado al "registro".

También probé un enfoque mencionado en otro hilo, que recomendaba el uso de:

program &> log & 

Aunque funciona bien, parece que no puede capturar el resultado del "programa".

"Programa" también es interactivo de manera que, durante algunos segundos, generará comandos, es por eso que tengo el modo de suspensión 10 para darle tiempo suficiente para terminar.

¿Algun consejo?

¡Gracias!

Respuesta1

Con expect:

#!/usr/bin/env expect

package require Tcl 8.5

proc time_to_die {sid} {
    close $sid
    # if close is insufficient (e.g. the program is badly behaved) may
    # need to instead get and blast away at the pid
    #set pid [exp_pid $sid]
    #exec kill $pid
    exit
}

# spam output to this here file
log_file log

spawn -noecho TODOyourprogramhereFIXME

# and this here is in milliseconds
after 10000 [list time_to_die $spawn_id]

vwait godot

Lo cual debería ejecutar el programa en un PTY, recopilar su salida a través de la log_filellamada y después de 10 segundos cerrarlo. Si hay una salida distintiva que ocurre antes de que transcurran los 10 segundos, se podría detectarla y cerrar o finalizar el programa cuando eso suceda con una expectdetección más típica de la salida del programa.

información relacionada