Redirect output from background process

0

Objetivo: ter o programa em execução 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

Eu executei uma variação de diferentes opções de redirecionamento, mas parece que a saída não está sendo enviada para "log".

Eu também tentei uma abordagem mencionada em outro tópico, que recomendou o uso de:

program &> log & 

Apesar de funcionar bem, parece não conseguir capturar a saída de "programa".

"programa" também é interativo de uma forma que, por alguns segundos, mostrará comandos de saída, é por isso que eu tenho o sleep 10 para dar tempo suficiente para terminar.

Alguma dica?

Obrigado!

    
por t988GF 14.04.2017 / 18:49

1 resposta

0

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

O qual deve executar o programa em um PTY, coletar sua saída por meio da chamada log_file e, após 10 segundos, fechá-lo. Se houver uma saída distinta que acontece antes dos 10 segundos, pode-se detectar e fechar ou matar o programa quando isso acontece com uma detecção mais típica de expect da saída do programa.

    
por 14.04.2017 / 20:03