BASH的timeout命令作为xargs命令。

3

这是我在这里的第一篇帖子。我是一个业余爱好者。

我正在运行“Raspbian GNU/Linux 10(buster)”的 RPi4 上。

管道获取了一堆硬盘的电源状态。然而,在某些驱动器上,hdparm 会变得无响应。

为了尝试解决这个问题,我使用了 timeout 命令,后跟 hdparm 作为 xargs 管道中的参数,但是 timeout 现在超时了 xargs 而不是 hdparm。

该管道在最后一个部分(即 xargs 命令)之前都可以正常工作:

ls -l /dev/disk/by-uuid/ | grep -f /home/dec/drivelist| cut -d '/' -f 3 | xargs -I {} timeout -k 10 8 hdparm -C /dev/{}

(drivelist是一个ASCII文件,每行只有一个磁盘UUID。)

这将输出以下内容,并在sda2超时时退出并无法继续执行xargs。

/dev/sdf1:
 drive state is:  standby

/dev/sdd1:
 drive state is:  standby

/dev/sdg1:
 drive state is:  standby

/dev/sda2:
xargs: timeout: terminated by sig

这里的问题是超时实际上会超时xargs(或整个管道?),而不仅仅是hdparm。
我已经尝试过:
ls -l /dev/disk/by-uuid/ | grep -f /home/dec/drivelist| cut -d '/' -f 3 | xargs -I {} bash -C "timeout -k 10 8 hdparm -C /dev/{}"

这也不能按预期工作并输出:

bash: timeout -k 10 8 hdparm -C /dev/sdf1: No such file or directory
bash: timeout -k 10 8 hdparm -C /dev/sdd1: No such file or directory
bash: timeout -k 10 8 hdparm -C /dev/sdg1: No such file or directory
bash: timeout -k 10 8 hdparm -C /dev/sda2: No such file or directory

如何在管道中使此代码工作,避免多行代码?

感谢您的时间和帮助。

vLAd

关于HDPARM的其他问题

hdparm -C似乎会卡住检查一个2.7 TB的卷。该卷通过SATA-USB连接到RPi,并插入USB3端口。

在这样的大小下,hdparm -C可能需要几分钟才能完成,我只是不耐烦吗?

编辑

我已将此添加到管道中,在xargs之前,但无济于事;这会删除数字,因此sdXn变成了sdX。

grep -Eo "[a-z]{3}"

第二个显示的输出表明,在sda2之后没有更多的驱动器,因此我得出结论,原始版本有效,只是没有继续使用xargs。 - Armali
1
嗨Armali,为了让帖子更短,我在sda2后面截断了输出,还有更多内容。抱歉。 - vLAd
"hdparm -C ... 需要几分钟才能完成 ... "。在命令行上单独测试它,然后在脚本中记录下来?此外,可能将 --verbose 添加到您的 xargs 命令行中可能会显示有用的信息。祝你好运。(还有,第一篇帖子很棒!) - shellter
1
已测试,shellter,hdparm 最终会以代码 22 退出,但需要超过一分钟的时间。对于其他驱动器,它几乎立即完成。谢谢。 - vLAd
2个回答

1

你是不是想说:

bash -c "timeout -k 10 8 hdparm -C /dev/{}"

而不是

bash -C "timeout -k 10 8 hdparm -C /dev/{}"

bash 命令中的大写和小写 "[Cc]" 参数意义完全不同...


以上第二个输出是针对 bash -C 的,我在尝试了 bash -c 之后进行了尝试,但两者都没有得到我想要的结果。 - vLAd
1
建议编辑您的帖子,包括 bash -c 输出,因为那可能更接近您想要的内容,如果有错误,有人可能能够帮助解决该问题。 - tjm3772

1

我认为问题在于xargs在遇到由超时引起的退出状态时停止执行命令。解决这个问题的一种方法是停止使用xargs。尝试替换。

xargs -I {} timeout -k 10 8 hdparm -C /dev/{}

使用

while read -r dev; do timeout -k 10 8 hdparm -C "/dev/$dev"; done

谢谢pjh,我觉得我可以用这个做些事情。 - vLAd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接