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