Мне нужно настроить пакетное задание bash (сжатие файлов размером 5,1 тыс. на месте) так, чтобы в случае необходимости остановки/возобновления задания оно подождало, пока не окажется «между» файлами (только что завершит один и не начнет другой).
Мое сжатие выглядело бы так, pigz -9 -- rsnc*
если бы все выполнялось одновременно, и я размышлял о чем-то вроде:
ls rsnc* | while read file
do pigz -9 -- $file
if [ -f .intr ]
then break
fi
done
Надежный ли это способ достижения моей цели? Есть ли лучший способ?
решение1
Ты можешь trap
[1],[2] сигнал Ctrl+ C, INT и wait
для завершения каждого процесса.
#!/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
Примечание
Существует много способов просмотреть все файлы в каталоге [3] , но это всегдалучше избегать анализа выходных данныхls
[4] .
Рекомендации
- Перехват ctrl-c в Bash, простой пример.
- Ловушкииз Руководства по Bash для начинающих - Глава 12.
- Bash цикл по файлам.
- Некоторые причины, по которым лучшеизбегать анализа выходных данных ls.