スクリプトから何かを削除する必要がありますが、すべてのデータコピーが完了する前に削除され、削除が失敗することがあります。 「ブロックされた」削除を実行する方法を見つけましたが、何も見つかりませんでした。だから私は削除できるまで繰り返しスクリプトを書いてみましたが、うまくいきません。
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(成功的に削除されたことを意味)になるまで繰り返すべきではありませんか?
答え1
この[
コマンドは条件式を評価します。ここに入れても役に立ちません。
umount
標準出力に何も印刷しないので(エラーはstderrに移動します)、`sudo umount mount`
何も拡張されません。
そのように:
while [ ]
do
sleep 0.1
done
[
パラメータが渡されない場合は、コマンドが[
返されます。]
間違った(ゼロ以外の終了状態)ループに入らないようにします。
umount
標準出力にエラーが印刷されても、[
この出力で生成された単語は有効な条件式を形成しないため、このコマンドを使用することは意味がありません。
希望する場所は次のとおりです。
until sudo umount mount
do
sleep 0.1
done
[
つまり、コマンドの終了状態ではなくsudo / umountの終了状態を確認したいのです。
umount
これは、stderrにエラーや警告が出力されていることを確認したい場合に[
便利です。これはnullをテストするために-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
または、「マウント」を複数回マウントすることができ、すべてマウント解除したい場合:
while mountpoint -q mount; do
sudo umount mount || sleep 0.1
done
答え2
再利用可能な機能で、「n」秒後にタイムアウトします。
_umount() {
[[ $# -lt 2 ]] && {
echo "Usage: ${FUNCNAME} <timeout_secs> <mnt_point>"; return 1
}
timeout=$(($(date +%s) + ${1}))
until umount "${2}" 2>/dev/null || [[ $(date +%s) -gt $timeout ]]; do
:
done
}
寝る必要はありません。