我需要在脚本中卸载某些内容,但有时需要先卸载所有数据,然后再完成卸载,这会导致umount失败。我正在寻找一种方法来进行“阻止”卸载,但是我什么也没找到。因此,我尝试编写一个脚本来循环直到可以将其卸载,但该脚本无法正常工作。
while [ `sudo umount mount` ]
do
sleep 0.1
done
rmdir mount
运行时输出:
umount: /home/evantandersen/mount: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
rmdir: failed to remove `mount': Device or resource busy
它应该不循环直到返回值sudo umount mount
0表示已成功卸载吗?
该[
命令用于评估条件表达式。这里没有用。
由于umount
在标准输出上不输出任何内容(错误归于stderr),因此`sudo umount mount`
扩展为空。
就像这样:
while [ ]
do
sleep 0.1
done
该[
命令时没有通过任何参数旁边[
,并]
返回假(非零退出状态),这样你就不会进入循环。
即使umount
在stdout上输出了错误,使用该[
命令也没有任何意义,因为由该输出产生的单词永远不会构成有效的条件表达式。
您要在这里:
until sudo umount mount
do
sleep 0.1
done
也就是说,您要检查sudo / umount而不是[
命令的退出状态。
如果要检查umount
在stderr上是否输出任何错误或警告,那[
可能是有用的地方。的-n "some-string"
是通过所识别的条件表达式[
命令测试是否"some-string"
是空的或没有,所以这样的:
while [ -n "$(sudo umount mount 2>&1 > /dev/null)" ]; do
sleep 0.1
done
但是寻找错误或警告消息通常不是一个好主意。该umount
命令告诉我们它是否以退出代码成功执行,这要可靠得多。它可能会成功,但仍会输出一些警告消息。它可能会失败,并且不会输出错误(例如被杀死时)。
在这种特殊情况下,请注意,umount
由于未装入目录,这可能会失败,并且在这种情况下您将永远循环,因此您可以尝试另一种方法,例如:
while mountpoint -q mount && ! sudo umount mount; do
sleep 0.1
done
或者,如果“ mount”可能已经安装了几次,而您想全部卸载它们:
while mountpoint -q mount; do
sudo umount mount || sleep 0.1
done
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句