【发布时间】:2020-05-30 16:28:50
【问题描述】:
我在工作站的多个硬盘驱动器上运行多个“粉碎”命令。 'shred' 命令都在后台运行,以便同时运行这些命令。每个“粉碎”的输出都被重定向到一个文本文件,我也将输出定向到终端。我正在使用 tail 监视日志文件中的错误,如果遇到任何错误,则停止脚本。如果没有错误,脚本应该简单地继续得出结论。当我通过强制驱动器故障(断开驱动器)对其进行测试时,它会检测到 I/O 错误并且脚本会按预期停止。我遇到的问题是,当没有错误时,一旦“粉碎”命令完成,我就无法终止“尾巴”,而脚本此时就挂起。由于我将“tail”命令放在下面的“while”循环中,我原以为只要“shred”进程正在运行,“tail”就会继续运行,但在“shred”进程停止后会停止,从而结束'while'循环。但事实并非如此。即使“粉碎”进程结束,脚本仍然挂起。如果我在脚本“挂起”时转到另一个终端窗口并终止“尾”进程,则脚本将照常继续。任何想法如何在“粉碎”过程消失时结束“尾部”过程?
我的代码:
shred -n 3 -vz /dev/sda 2>&1 | tee -a logfile &
shred -n 3 -vz /dev/sdb 2>&1 | tee -a logfile &
shred -n 3 -vz /dev/sdc 2>&1 | tee -a logfile &
pids=$(pgrep shred)
while kill -0 $pids 2> /dev/null; do
tail -qn0 -f logfile | \
read LINE
echo "$LINE" | grep -q "error"
if [ $? = 0 ]; then
killall shred > /dev/null 2>&1
echo "Error encountered. Halting."
exit
fi
done
wait $pids
“等待”之后还有其他代码执行其他操作,但这是脚本挂起的地方
【问题讨论】:
标签: while-loop wait tail shred