Preciso configurar meu trabalho em lote bash (compactando arquivos de 5,1k no local) para que, se eu precisar parar/retomar o trabalho, ele espere até que esteja "entre" os arquivos (acabe de terminar um e não tenha iniciado outro).
Minha compactação seria como pigz -9 -- rsnc*
se tudo fosse executado ao mesmo tempo, e eu estava pensando em algo como:
ls rsnc* | while read file
do pigz -9 -- $file
if [ -f .intr ]
then break
fi
done
Este é um meio confiável de atingir meu objetivo? Existe uma maneira melhor?
Responder1
Você pode trap
[1],[2] o sinal Ctrl+ C, o INT, e wait
para o final de cada processo.
#!/bin/bash
trap ctrl_c INT
function ctrl_c() {
wait # wait for the end of all child processes
exit # <<--- put here your exit code exit 1, ...
}
shopt -s nullglob
for f in rsnc*
do
pigz -9 -- $file & # Execute in background
wait $! # Wait for the end of the last command
done
Observação
Existem muitas maneiras de percorrer todos os arquivos em um diretório [3] , mas é sempreé melhor evitar analisar a saída dels
[4] .
Referências
- Capturando ctrl-c no Bash, um exemplo simples.
- Armadilhasdo Guia Bash para Iniciantes - Capítulo 12.
- Loop Bash sobre arquivos.
- Algumas razões pelas quais é melhorevite analisar a saída ls.