Pythonで記述されたバックアップスクリプトがあり、ソースディレクトリをコピーする前に宛先ディレクトリを作成します。/external-backup
を宛先として使用するように設定しました。外付けハードドライブをマウントする場所です。ハードドライブをオン(またはマウント)せずにスクリプトを実行したところ、内部ハードドライブにバックアップを作成しましたが、十分な空き領域がないため、スクリプトは正常に機能していました。自分自身をバックアップします。
私の質問は、書き込み前にボリュームが正しい場所にマウントされているかどうかを確認するにはどうすればよいですか? /external-backup
がマウントされていないことを検出できれば、書き込みを禁止できます。
おまけの質問は、ディレクトリが別のデバイス上に存在するはずであるとOSが認識しているときに、なぜこれが許可されたのか、そしてそのデバイス(外付けハードドライブ)を後でマウントすると(内蔵ハードドライブ上の)データはどうなるのかということです。明らかに、同じパスの異なるデバイスに2つのコピーを置くことはできません。
前もって感謝します!
os.path.ismount()
を見てみましょう。
カーネルだけが確実に知っていることに対する明確な答えについては、カーネルに尋ねてください:
cat /proc/mounts
そのファイルは、好きなツールを使用して、通常のファイルのように読み取り/解析できます。 Pythonを含みます。 Quick-n-dirtyの例:
#!/usr/bin/python
d = {}
for l in file('/proc/mounts'):
if l[0] == '/':
l = l.split()
d[l[0]] = l[1]
import pprint
pprint.pprint(d)
チェックする最も簡単な方法は、mount
を介してsubprocess
を呼び出し、そこに表示されるかどうかを確認することです。追加のクレジットについては、_/dev/disk/by-*
_の内容に対してos.readlink()
を使用して、それがどのデバイスであるかを判別します。
古い質問ですが、私は自分の解決策( Dennis Williamson's および Ignacio Vazquez-Abrams's の回答に基づいて)にとにかく貢献すると思いました。マウントされているリモートディレクトリを確認するためにLinux以外の環境で使用しているため、/ procおよびmtab は使用できず、追加のチェックは実装されていません。
def is_mounted(special, directory):
search_prefix = '{} on {}'.format(special, directory.rstrip('/'))
if os.path.ismount(directory):
mounts = subprocess.check_output(['mount']).split('\n')
for line in mounts:
if line[:len(search_prefix)] == search_prefix:
return True;
return False
改善は歓迎します!
ボーナス答え。外部デバイスがマウントされていない場合、データはパス/external-backup
のルートパーティションに書き込まれます。外部デバイスがマウントされている場合、ルートパーティション上のデータはまだ存在しますが、/external-backup
が外部デバイスを指しているため、到達できません。
/ etc/mtabファイルは、現在マウントされているものを通知するために存在します。 getmntent
呼び出しがありますが、os
モジュールにエクスポートされているとは思いません。早くて汚い?/etc/mtabを開いて分割します。デバイスが列0にあり、列1の宛先マウントポイントが正しいことを確認します。