web-dev-qa-db-ja.com

デバイスがビジーでなくなるまで、アンマウントを待機させる方法は?

一連のコマンドを実行するbashスクリプトファイルがあります。

#!/bin/bash
umount /media/hdd1
umount /media/hdd2
something1
something2

ただし、ファイルの後半のコマンドはマウント解除されたHDDで機能するため、続行する前に、マウント解除が成功したことを確認する必要があります。

もちろん、umountが失敗したかどうかを確認して、1だけを終了できますが、それは理想的ではありません。

だから基本的に、私がやりたいことは、デバイスがビジーでなくなるまでumountコマンドを何とかしてからHDDをアンマウントしてスクリプトの実行を続けることです。

したがって、次のように機能します。

#!/bin/bash
umount /media/hdd1 # Device umounted without any problems continuing the script..
umount /media/hdd2 # Device is busy! Let's just sit around and wait until it isn't... let's say 5 minutes later whatever was accessing that HDD isn't anymore and the umount umounts the HDD and the script continues
something1
something2

ありがとうございました。

3
Askerman

次のスクリプトが仕事をすると思います。 Sudo(スーパーユーザー権限)で実行する必要があります。

doerループを持つ関数whileがあります。これは、デバイスが指定されたマウントポイントにマウントされているかどうかをmountpointでチェックし、マウントされている場合はumount。論理変数busyがfalseの場合、whileループは終了し、スクリプトは「何かをする」ことを開始できます。

#!/bin/bash


function doer() {

busy=true
while $busy
do
 if mountpoint -q "$1"
 then
  umount "$1" 2> /dev/null
  if [ $? -eq 0 ]
  then
   busy=false  # umount successful
  else
   echo -n '.'  # output to show that the script is alive
   sleep 5      # 5 seconds for testing, modify to 300 seconds later on
  fi
 else
  busy=false  # not mounted
 fi
done
}

########################

# main

########################

doer /media/hdd1
doer /media/hdd2

echo ''
echo 'doing something1'
echo 'doing something2'
3
sudodus