Você pode usar o programa batch
que faz parte do pacote at (ferramentas para enfileiramento de tarefas). Ele é instalado por padrão em muitos sistemas.
Eu tenho uma câmera de vigilância e um programa grava vídeos quando um movimento é detectado. Basicamente, este programa salva o vídeo em um formato muito pesado.
Minha solução foi chamar um script que converte o vídeo usando o ffmpeg. O script é chamado toda vez que um vídeo é feito.
A conversão leva um tempo relativamente curto, mas muito uso da CPU. O problema surge quando um novo vídeo chega para ser convertido e a conversão do outro não foi concluída. Nessa situação, o script é chamado novamente, resultando em dois ou mais processos ffmpeg que fazem a máquina quase travar durante um tempo considerável.
Como posso enfileirar o trabalho de conversão, para ser executado depois que o anterior é feito? O que eu quero é ter apenas um processo de ffmpeg de cada vez.
Eu configuraria um diretório de filas e faria com que um processo em segundo plano passasse pelo diretório de filas e gerasse a conversão de ffmpeg. E o exemplo do programa em segundo plano pode ser:
queue=/var/tmp/vidq
outdir=/var/tmp/videos
while true; do # do forever
for file in $queue/*; do
name='basename $file'
mv -f $file $queue/.current
ffmpeg -i .current $outdir/$name
touch -r $queue/.current $outdir/$name
rm $queue/.current
done
sleep 300 # sleep for 5 minutes
done
Você teria que fazer algumas verificações de segurança, como se o arquivo na fila não fosse um arquivo de vídeo. E ajuste o valor do sono. Mas isso geraria o arquivo convertido com o mesmo nome e com o datestamp original.
Outra maneira é ter um bloqueio de arquivo que é verificado, quando o processo ffmpeg sai, o bloqueio é removido e outro processo pode ser iniciado, primeiro criando o bloqueio de arquivo. No entanto, isso significa que a lógica está agora no programa e deve controlar quais arquivos devem ser processados. A solução de diretório de filas acima significa que o programa front-end precisa apenas entregá-lo à fila.