Mate o próprio livestreamer.
trap "killall livestreamer" SIGINT
Estou usando livestreamer
e ffmpeg
para capturar imagens de uma transmissão ao vivo a 0,1 fps:
livestreamer --player "ffmpeg -i" --player-args "{filename} -vf fps=1/10 out%04d.png" https://www.ustream.tv/channel/number worst
Não consegui que o ffmpeg sobrescrevesse sua saída, por isso continua criando novos arquivos com o padrão out%04d.png
. Isso é bom, eu posso acompanhar o mais novo arquivo e excluir os antigos. No entanto, o processo livestreamer
às vezes sai por vários motivos e eu gostaria de reiniciá-lo automaticamente, desde que eu queira executá-lo.
Uma tentativa usando um subshell não reagiu ao CTRL-C como eu esperava, porque o sinal não é passado no subshell:
#!/bin/bash
( while true; do
livestreamer --player "ffmpeg -i" --player-args "{filename} -vf fps=0.1 out%04d.png" https://www.ustream.tv/channel/number worst
done ) &
while true; do
newestImage=${code to find newest image}
postProcess $newestImage
deleteOldImages
sleep 5
done
Quando eu envio SIGINT
para o script acima, o subshell permanece ativo mesmo quando eu fecho o shell no qual iniciei o script pai. O diretório de saída é inundado com novos arquivos enquanto o código que deve excluí-los não está mais sendo executado. Um trap
não ajudou:
trap "kill $SUBSHELL_PID" SIGINT
( ... ) & # subshell as above
SUBSHELL_PID=&!
Com isso, nem consegui interromper o script pai. Obviamente, eu não tenho experiência com manipulação de sinais no bash, então estou feliz com qualquer conselho que me faça avançar. Preciso reiniciar o frame-grabber enquanto o script pai estiver em execução e controlar os arquivos antigos para excluí-los.
Edit: A subshell pode ser uma má ideia em primeiro lugar? Posso de alguma forma lançar livestreamer
em segundo plano e matá-lo quando quiser ou reiniciá-lo quando sair sozinho?
Mate o próprio livestreamer.
trap "killall livestreamer" SIGINT
Tags kill shell bash-scripting