1

我在工作站的多个硬盘驱动器上运行多个“粉碎”命令。'shred' 命令都在后台运行,以便同时运行命令。每个“粉碎”的输出都被重定向到一个文本文件,我也将输出定向到终端。我正在使用 tail 来监视日志文件中的错误,如果遇到任何错误,则停止脚本。如果没有错误,脚本应该简单地继续得出结论。当我通过强制驱动器故障(断开驱动器)对其进行测试时,它会检测到 I/O 错误并且脚本会按预期停止。我遇到的问题是,当没有错误时,一旦“粉碎”命令完成,我就无法让“尾巴”终止,而脚本此时就挂起。因为我把'尾巴' 在下面的“while”循环中的命令,我原以为只要“shred”进程正在运行,“tail”就会继续运行,但在“shred”进程停止后会停止,从而结束“while”环形。但事实并非如此。即使“粉碎”进程结束,脚本仍然挂起。如果我在脚本“挂起”时转到另一个终端窗口并终止“尾”进程,则脚本将照常继续。当“粉碎”过程消失时,任何想法如何让“尾部”过程结束?从而结束'while'循环。但事实并非如此。即使“粉碎”进程结束,脚本仍然挂起。如果我在脚本“挂起”时转到另一个终端窗口并终止“尾”进程,则脚本将照常继续。当“粉碎”过程消失时,任何想法如何让“尾部”过程结束?从而结束'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

在“等待”之后还有其他代码可以执行其他操作,但这是脚本挂起的地方

4

1 回答 1

0

与问题没有直接关系,但您可以使用Daggy - Data Aggregation Utility 在这种情况下,所有子流程都将以主 daggy 流程结束。

于 2020-05-03T19:27:11.537 回答