web-dev-qa-db-ja.com

Pythonを使用するはずの場所にボリュームがマウントされているかどうかを確認するにはどうすればよいですか?

Pythonで記述されたバックアップスクリプトがあり、ソースディレクトリをコピーする前に宛先ディレクトリを作成します。/external-backupを宛先として使用するように設定しました。外付けハードドライブをマウントする場所です。ハードドライブをオン(またはマウント)せずにスクリプトを実行したところ、内部ハードドライブにバックアップを作成しましたが、十分な空き領域がないため、スクリプトは正常に機能していました。自分自身をバックアップします。

私の質問は、書き込み前にボリュームが正しい場所にマウントされているかどうかを確認するにはどうすればよいですか? /external-backupがマウントされていないことを検出できれば、書き込みを禁止できます。

おまけの質問は、ディレクトリが別のデバイス上に存在するはずであるとOSが認識しているときに、なぜこれが許可されたのか、そしてそのデバイス(外付けハードドライブ)を後でマウントすると(内蔵ハードドライブ上の)データはどうなるのかということです。明らかに、同じパスの異なるデバイスに2つのコピーを置くことはできません。

前もって感謝します!

9
Ben Hymers

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)
5
Insyte

チェックする最も簡単な方法は、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

改善は歓迎します!

2
Magentron

ボーナス答え。外部デバイスがマウントされていない場合、データはパス/external-backupのルートパーティションに書き込まれます。外部デバイスがマウントされている場合、ルートパーティション上のデータはまだ存在しますが、/external-backupが外部デバイスを指しているため、到達できません。

2
Casual Coder

/ etc/mtabファイルは、現在マウントされているものを通知するために存在します。 getmntent呼び出しがありますが、osモジュールにエクスポートされているとは思いません。早くて汚い?/etc/mtabを開いて分割します。デバイスが列0にあり、列1の宛先マウントポイントが正しいことを確認します。

1
McJeff