Làm cách nào tôi có thể kiểm tra xem một ổ đĩa có được gắn ở nơi được cho là đang sử dụng Python không?


9

Tôi đã có một tập lệnh sao lưu được viết bằng Python để tạo thư mục đích trước khi sao chép thư mục nguồn vào nó. Tôi đã cấu hình nó để sử dụng /external-backuplàm đích đến, đó là nơi tôi gắn ổ cứng ngoài. Tôi chỉ chạy tập lệnh mà không bật ổ cứng (hoặc được gắn) và thấy rằng nó hoạt động như bình thường, mặc dù tạo một bản sao lưu trên ổ cứng bên trong, không có đủ dung lượng để sao lưu.

Câu hỏi của tôi là: làm thế nào tôi có thể kiểm tra xem âm lượng được gắn đúng chỗ trước khi ghi vào nó? Nếu tôi có thể phát hiện ra điều đó /external-backupkhông được gắn kết, tôi có thể ngăn việc viết thư cho nó.

Câu hỏi phần thưởng là tại sao điều này được cho phép, khi HĐH biết rằng thư mục đó được cho là sống trên một thiết bị khác và điều gì sẽ xảy ra với dữ liệu (trên ổ cứng bên trong) sau này tôi có nên gắn thiết bị đó (ổ cứng ngoài) không? Rõ ràng không thể có hai bản sao trên các thiết bị khác nhau trên cùng một đường dẫn!

Cảm ơn trước!

Câu trả lời:


22

Tôi sẽ xem xét os.path.ismount().


1
Vấn đề duy nhất là nó trả về một boolean & không chỉ định liệu thiết bị phù hợp có ở đó không.
McJeff

3
@McJeff: Đó là sự thật, nó không nói nếu nó nói nếu . Nếu không có thiết bị nào ở đó, nó sẽ trả về false và ghi vào đường dẫn đó sẽ ghi vào thư mục bên dưới trong hệ thống tệp cha . Vì vậy, nếu nó trả về false, hãy báo lỗi và không viết ở đó. Thư mục /external-backupkhông tồn tại trên một thiết bị bên ngoài, nó nằm trên hệ thống tập tin mẹ. Hệ thống chỉ biết những gì mountnói với nó, nó không có ý tưởng gì nên có ở đó. Không có gì đặc biệt về "điểm gắn kết" trên hệ thống tệp Unix. Nó chỉ là một thư mục thông thường.
Tạm dừng cho đến khi có thông báo mới.

Đó là công việc hoàn hảo. Tôi sẽ không bảo vệ chống lại các khối lượng khác được gắn ở đó, chỉ là nó không phải là hệ thống tập tin mẹ. Xin lỗi những người trả lời khác, câu trả lời của bạn có thể trả lời chính xác hơn câu hỏi của tôi nhưng tôi sợ rằng tôi không biết phải hỏi gì ngay từ đầu vì bạn có thể nói như thế nào;) Dù sao tôi cũng đánh giá bạn .
Ben Hymers

Lời giải thích hay!
McJeff

5

Để có câu trả lời dứt khoát cho một cái gì đó chỉ có kernel biết chắc chắn, hãy hỏi kernel:

cat /proc/mounts

Tập tin đó có thể được đọc / phân tích như thể đó là một tập tin bình thường, sử dụng bất kỳ công cụ nào bạn thích. Bao gồm cả Python. Ví dụ nhanh-n-bẩn:

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

Cách dễ nhất để kiểm tra là gọi mountqua subprocessvà xem nếu nó hiển thị ở đó. Để có thêm tín dụng, hãy sử dụng os.readlink()nội dung của nó /dev/disk/by-*để tìm ra thiết bị nào.


Như tôi thấy, vấn đề với cách tiếp cận đó là đầu ra của mountđược xác định rõ ràng là tốt nhất. mountĐầu ra là gì nếu tôi đã gắn kết /dev/evil device on tourtại /directory on which I mount devices? Việc phân tích cú pháp đầu ra có thể không đáng tin cậy trong những trường hợp như vậy ...
vọt vào

2

Thưởng trả lời. Nếu thiết bị bên ngoài không được gắn kết, dữ liệu sẽ được ghi vào phân vùng gốc tại đường dẫn /external-backup. Nếu thiết bị bên ngoài được gắn dữ liệu trên phân vùng gốc vẫn còn nhưng không thể truy cập được vì /external-backuphiện đang trỏ đến thiết bị bên ngoài.


2

Câu hỏi cũ, nhưng tôi nghĩ tôi sẽ đóng góp giải pháp của mình (dựa trên câu trả lời của Dennis WilliamsonIgnacio Vazquez-Abrams ) bằng mọi cách. Vì tôi đang sử dụng nó trên môi trường không phải Linux để kiểm tra các thư mục từ xa đang được gắn kết, / Procmtab không thể được sử dụng và không có kiểm tra bổ sung nào được thực hiện:

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

Cải tiến chào mừng!


1

Tệp / etc / mtab tồn tại để cho bạn biết những gì hiện đang được gắn kết. Có một getmntentcuộc gọi, nhưng tôi không nghĩ rằng nó được xuất trong osmô-đun. Nhanh và bẩn? Mở / etc / mtab và chia. Đảm bảo thiết bị của bạn có mặt trong cột 0 và điểm gắn kết đích trong cột 1 là chính xác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.