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

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

tar単一のシェルスクリプトで、ボリューム、マウントされたボリュームの内容をマウントし、マウントされたボリュームをアンマウントする必要があります。

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

$ 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)。

同じスクリプトにメソッド(install、tar、uninstall)がありますか?

ポリスチレン:スクリプトの完了後に/tmp/mntボリュームをアンマウントできます。

答え1

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

#!/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

今は正しいです。

答え2

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 )

これはどこかに行き、戻ってくるよりはるかに明確で明確ですcd。特に、スクリプト中に複数のディレクトリに移動する必要がある場合は、さらにそうです。

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

-C次のフラグのより短いバリエーションを使用してくださいtar

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

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

関連情報