如果遇到错误,则停止 bash 脚本中的“shred”命令

如果遇到错误,则停止 bash 脚本中的“shred”命令

我有一个工作站,我们已将其设置为清理多个硬盘。我运行一个脚本来检测硬盘,然后在每个硬盘上运行“shred”命令。问题是,如果在“shred”运行时任何硬盘发生故障(Ubuntu 不再看到该驱动器),“shred”不会停止,而是会一行接一行地输出以下内容:

shred: /dev/sdd: error writing at offset 103456287104: Input/Output error

我没有看到任何“shred”选项,使其在遇到错误时退出,而且我显然不希望脚本在出现 I/O 错误的情况下一直运行。由于“shred”在遇到此错误时不会自行停止,因此必须同时运行其他程序来执行某种错误检查。在我的脚本中,我将“shred”的详细输出重定向到日志文件,并且我实际上使用该日志文件在脚本的另一部分检查“shred”是否成功完成。但我不确定如何持续检查该日志文件尽管“shred”仍在运行。

有人知道我如何才能完成这种“并行错误检查”吗?

我知道“wipe”命令在检测到 I/O 错误时会退出,但由于我们无法控制的原因,我们只能使用“shred”。令人沮丧的是,“shred”没有这样做。让它在出现错误时停止似乎是一件轻而易举的事,但......它却没有。

这是我的脚本的“粉碎”部分:

#!/bin/bash
log=/root/sanilog.txt
## get disks list
drives=$(lsblk -nodeps -n -o name |grep "sd")
for d in $drives; do
     shred -n 3 -v /dev/$d >> $log 2>&1
done

答案1

我正在编写一个使用 shred 的脚本。

我遇到了和你同样的问题,但可以这样做:

# My device become the variable "$dev"
dev=/dev/sdd

# Running Shred using my variable and put the output 2 & 1 (msg and error) in a file, then put & to launch in background
# The log file will be shred_sdd.log
# ${dev:5} means /dev/sdd without the first 5 characters, because '/' is nod good in a file name
shred -fvzn1 "$dev" >"shred_${dev:5}.log" 2>&1 &

# So while the pid concerning sdd is running, check word 'error' in the the shred_sdd.log, if yes then write a message and kill the PID, else wait 60 sec before re-checking 
while ps aux|grep "shred.*${dev}"|grep -v 'grep' >/dev/null; do
< "shred_${dev:5}.log" grep -i 'error' >/dev/null
if [ $? = 0 ]; then
  echo "Too much sector defect on the device ${dev}, shred can not continue"
  PID=$( ps aux|grep "shred.*${dev}"|grep -v 'grep'|awk '{print $2}' )
  kill -9 "$PID"
  break        
else
  sleep 60
fi
done

您可以使用一个功能对所有设备执行相同的任务

# Variables of my devices (You can use lsblk, depends your configuration)
devices=$(lsscsi -t | grep disk | grep sas | awk '{print $NF}')

function_shred() {
# Put the code here that I wrote previously
}

for dev in $devices; do
function_shred &
done

答案2

set -e如果任何命令返回非零退出代码,则 bash 脚本顶部的命令将导致脚本退出。

您还可以尝试EXIT trap让脚本自行清理


如果不介意尝试另一种方法shreddd可以做类似的工作:

dd if=/dev/urandom of=/dev/sdd bs=4096

如果你疑神疑鬼的话,就给它两次机会吧:)

和 ubuntu 也有wipe

wipe /dev/sdd

wipe 反复将特殊模式覆盖到要销毁的文件中,使用 fsync() 调用和/或 O_SYNC 位强制访问磁盘。在正常模式下,使用 34 种模式(其中 8 种是随机的)。

相关内容