Redirecionar saída do processo em segundo plano

Redirecionar saída do processo em segundo plano

Objetivo: Ter o programa rodando em segundo plano (com um PID), capturar o PID, coletar a saída e eliminar o PID.

Meu código:

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

Executei uma variação de diferentes opções de redirecionamento, mas não consigo enviar a saída para "log".

Também tentei uma abordagem mencionada em outro tópico, que recomendava o uso de:

program &> log & 

Mesmo que funcione bem, parece que não consegue capturar a saída do "programa".

O "programa" também é interativo de forma que irá, por alguns segundos, emitir comandos, por isso tenho o sleep 10 para dar tempo suficiente para terminar.

Alguma dica?

Obrigado!

Responder1

Com 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

Que deve executar o programa em um PTY, coletar sua saída por meio da log_filechamada e após 10 segundos fechá-lo. Se houver uma saída distinta que aconteça antes dos 10 segundos, pode-se detectar isso e fechar ou encerrar o programa quando isso acontecer com uma expectdetecção mais típica da saída do programa.

informação relacionada