Necesito configurar mi trabajo por lotes bash (comprimiendo archivos de 5.1k en el lugar) de modo que si necesito detener/reanudar el trabajo, esperará hasta que esté "entre" archivos (acaba de terminar uno y no ha iniciado otro).
Mi compresión se vería pigz -9 -- rsnc*
si se ejecutara toda a la vez, y estaba contemplando algo como:
ls rsnc* | while read file
do pigz -9 -- $file
if [ -f .intr ]
then break
fi
done
¿Es este un medio confiable para lograr mi objetivo? ¿Existe una mejor manera?
Respuesta1
Puede trap
[1],[2] la señal Ctrl+ C, la INT y wait
para el final de cada proceso.
#!/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
Nota
Hay muchas formas de recorrer todos los archivos de un directorio [3] , pero siempre eses mejor evitar analizar la salida dels
[4] .
Referencias
- Atrapando Ctrl-c en Bash, un ejemplo sencillo.
- Trampasde la Guía Bash para principiantes - Capítulo 12.
- Bash bucle sobre archivos.
- Algunas razones por las que es mejorevitar analizar la salida de ls.