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_file
chamada 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 expect
detecção mais típica da saída do programa.