Bir birimin Python kullanması gereken yere monte edilip edilmediğini nasıl kontrol edebilirim?


11

Kaynak dizini ona kopyalamadan önce hedef dizini oluşturan Python'da yazılmış bir yedek komut dosyası var. /external-backupHarici sabit diski taktığım yer olan hedef olarak kullanacak şekilde yapılandırdım . Sadece sabit disk açılmadan (veya monte edilmeden) betiği çalıştırdım ve normal sabit olarak çalıştığını buldum, ancak dahili sabit diskte, kendisini yedekleyecek kadar yakın bir yere sahip olmasa da.

Sorum şu: Birime yazmadan önce birimin doğru yere monte edilip edilmediğini nasıl kontrol edebilirim? /external-backupMonte edilmediğini tespit edebilirsem, ona yazmayı engelleyebilirim.

Bonus soru şudur: İşletim sistemi dizinin başka bir cihazda yaşaması gerektiğini bildiğinde neden buna izin verildi ve daha sonra bu cihazı (harici sabit sürücü) takmam gerekir mi? Açıkçası, aynı yoldaki farklı cihazlarda iki kopya olamaz!

Şimdiden teşekkürler!

Yanıtlar:


24

Bir göz atarım os.path.ismount().


1
Tek sorun, bir boole döndürmesi ve doğru cihazın orada olup olmadığını belirtmemesidir.
McJeff

3
@McJeff: Bu doğru o söylemez ki o söyler eğer . Hiçbir aygıt yoksa, false değerini döndürür ve bu yola bir yazma işlemi üst dosya sistemindeki temel dizine yazılır . Eğer yanlış döndürürse, bir hata verin ve oraya yazmayın. Dizin /external-backupharici bir aygıtta değil, üst dosya sisteminde yaşıyor. Sistem sadece mountona ne söylediğini bilir , orada ne olması gerektiği hakkında hiçbir fikri yoktur. Unix dosya sistemindeki "bağlama noktası" hakkında özel bir şey yoktur. Sadece sıradan bir dizin.
sonraki duyuruya kadar duraklatıldı.

Bu işi mükemmel yapıyor. Oraya monte edilen diğer birimlere karşı korumayacağım, sadece üst dosya sistemi değil. Diğer cevap verenler için özür dilerim, cevaplarınız sorumu daha iyi cevaplayabilir ama korkarım ilk etapta ne isteyeceğinizi tam olarak bilmiyordum; .
Ben Hymers

İyi açıklama!
McJeff

5

Sadece çekirdeğin bildiği bir şeye kesin bir cevap için çekirdeğe sorun:

cat /proc/mounts

Bu dosya, istediğiniz herhangi bir araç kullanılarak normal bir dosya gibi okunabilir / ayrıştırılabilir. Python dahil. Hızlı-kirli örnek:

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

4

Kontrol etmenin en kolay yolu mountüzerinden çağırmak subprocessve orada görünüp görünmediğini görmek. Ekstra kredi için, hangi cihazın olduğunu os.readlink()bulmak için içeriğini kullanın /dev/disk/by-*.


Gördüğüm kadarıyla bu yaklaşımla ilgili sorun, çıktısının mounten iyi şekilde terbiyesizce tanımlanmasıdır. Ne yapar mountben monte varsa çıkışını /dev/evil device on touren /directory on which I mount devices? Çıktının ayrıştırılması bu gibi durumlarda güvenilmez olabilir ...
skyking

2

Bonus cevap. Harici aygıt takılı değilse, veriler yoldaki kök bölüme yazılır /external-backup. Harici aygıt takılıysa, kök bölümündeki veriler hala oradadır, ancak /external-backupartık harici aygıta işaret ettiği için erişilemez .


2

Eski soru, ama yine de çözümüme katkıda bulunacağımı düşündüm ( Dennis Williamson ve Ignacio Vazquez-Abrams'ın cevabına dayanarak ). Bağlanan uzak dizinleri kontrol etmek için Linux olmayan bir ortamda kullandığım için, / proc ve mtab kullanılamaz ve ek denetimler uygulanmadı:

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

Gelişmeler hoş geldiniz!


1

/ Etc / mtab dosyası, şu anda nelerin takılı olduğunu size bildirmek için vardır. Bir getmntentçağrı var, ama osmodülde dışa aktarıldığını sanmıyorum . Çabuk ve kirli mi? / Etc / mtab ve split öğelerini açın. Cihazınızın sütun 0'da bulunduğundan ve sütun 1'deki hedef bağlama noktasının doğru olduğundan emin olun.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.