我在一个工作站的多个硬盘上运行多个“shred”命令。“shred”命令都在后台运行,以便同时运行这些命令。每个“shred”的输出被重定向到一个文本文件,我也将输出定向到终端。我使用tail监视日志文件中的错误,并在遇到错误时停止脚本。如果没有错误,脚本应该简单地继续到结论。当我通过强制驱动器故障(断开驱动器连接)来测试它时,它会检测到I/O错误,并且脚本会像预期的那样停止。我遇到的问题是,当没有错误时,一旦“shred”命令完成,我就不能让“tail”终止,脚本就会在那个时候挂起。由于我将'tail‘命令放在下面的'while’循环中,我会认为只要'shred‘进程在运行,'tail’就会继续运行,但在'shred‘进程停止后会停止,从而结束'while’循环。但事实并非如此。即使在“shred”进程结束后,脚本仍然挂起。如果我在脚本"hangiing“时转到另一个终端窗口,并终止”tail“进程,脚本将照常继续。当“分解”进程消失时,如何让“尾部”进程结束?
我的代码:
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在'wait‘之后还有其他代码来做其他事情,但这就是脚本挂起的地方
发布于 2020-05-04 03:27:12
与问题没有直接关系,但你可以使用Daggy - Data Aggregation Utility,在这种情况下,所有子进程都将以主daggy进程结束。
https://stackoverflow.com/questions/60233671
复制相似问题