我需要设置我的 bash 批处理作业(就地压缩 5.1k 个文件),以便如果我需要停止/恢复该作业,它将等到它位于“文件之间”(刚刚完成一个并且还没有启动另一个)。
我的压缩看起来就像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]。
参考
- 在 Bash 中捕获 ctrl-c,一个简单的例子。
- 陷阱摘自《Bash 初学者指南》-第 12 章。
- Bash 循环遍历文件。
- 为什么最好避免解析 ls 输出。