web-dev-qa-db-ja.com

同じシェルスクリプトでマウントおよびアンマウントするとエラーが発生する

ボリュームtarをマウントし、マウントされたボリュームのコンテンツをマウントして、マウントされたボリュームを1つのシェルスクリプトでマウント解除する必要があります。

だから私は次のようにコーディングしました、

$ cat sample.sh
Sudo mount -o loop Sample.iso /tmp/mnt
cd /tmp/mnt
tar-cvf /tmp/sample.tar *
Sudo umount /tmp/mnt

エラーが発生しましたumount: /tmp/mnt: device is busy.

だから私はチェックしました

$ lsof /tmp/mnt

現在の「sh」ファイルを出力します。だから私は自分自身を確信しました、/tmp/mntは現在のスクリプトでビジーです(この場合、sample.sh)。

同じスクリプトで(mount、tar、unmount)を回避する方法はありますか?

PS:/ tmp/mntボリュームを一度アンマウントできますスクリプトが終了します。

5
Kumar

次のように、ディレクトリをアンマウントするには、ディレクトリを終了する必要があります。

#!/bin/bash
Sudo mount -o loop Sample.iso /tmp/mnt
cd /tmp/mnt
tar -cvf /tmp/sample.tar *
#Got to the old working directory. **NOTE**: OLDPWD is set automatically.
cd $OLDPWD
#Now we're able to unmount it. 
Sudo umount /tmp/mnt

それだ。

cdを使用して移動したため、デバイスは「ビジー」です。現在の作業ディレクトリ(任意のプロセス、この場合はシェル)のパーティションをアンマウントすることはできません。

あなたのスクリプト:

Sudo mount -o loop Sample.iso /tmp/mnt
cd /tmp/mnt
tar -cvf /tmp/sample.tar *
Sudo umount /tmp/mnt

同じ問題のない変更されたスクリプト:

Sudo mount -o loop Sample.iso /tmp/mnt
( cd /tmp/mnt && tar -cvf /tmp/sample.tar * )
Sudo umount /tmp/mnt

cdはサブシェルで発生するため、それ以外の環境には影響せず、umountの時点の現在のディレクトリは、スクリプトを実行したときの場所にあります。

これは非常に一般的なシェル構成です。つまり、

( cd dir && somecommand )

特に1つのスクリプトの実行中に複数のディレクトリに移動する必要がある場合は、どこかでcdを実行してから再度実行するよりも、はるかにクリーン(かつ明確)です。

&&を使用すると、何らかの理由でcdが失敗した場合にコマンドが実行されないことも意味します。スクリプトで、mountが失敗した場合でも、たとえば空の(?)ディレクトリのtarアーカイブを作成しますが、これは望んでいない場合があります。

tar-Cフラグを利用する短いバリアント:

Sudo mount -o loop Sample.iso /tmp/mnt
tar -cvf /tmp/sample.tar -C /tmp/mnt .
Sudo umount /tmp/mnt

これにより、現在のディレクトリ(/tmp/mnt)をアーカイブに追加する前に、内部でtarcdを実行します。ただし、これにより、隠しファイルまたはフォルダーもアーカイブに追加されることに注意してください。

11
Kusalananda