it-swarm-vi.tech

Cách tốt nhất để kiểm tra xem một ổ đĩa có được gắn trong tập lệnh Bash không?

Cách tốt nhất để kiểm tra xem một ổ đĩa có được gắn trong tập lệnh Bash không?

Điều tôi thực sự thích là một phương pháp mà tôi có thể sử dụng như thế này:

if <something is mounted at /mnt/foo> 
then
   <Do some stuff>
else
   <Do some different stuff>
fi
109
Mark Biek

Tránh sử dụng /etc/mtab bởi vì nó có thể không nhất quán.

Tránh đường ống mount vì nó không quá phức tạp.

Đơn giản:

if grep -qs '/mnt/foo ' /proc/mounts; then
    echo "It's mounted."
else
    echo "It's not mounted."
fi

(Khoảng trắng sau dấu /mnt/foo là để tránh kết hợp, ví dụ: /mnt/foo-bar.)

122
Dan Carley
if mountpoint -q /mnt/foo 
then
   echo "mounted"
else
   echo "not mounted"
fi

hoặc là

mountpoint -q /mnt/foo && echo "mounted" || echo "not mounted"
61
Zaptac

findmnt -rno SOURCE,TARGET "$1" tránh tất cả các vấn đề trong các câu trả lời khác. Nó hoàn toàn làm công việc chỉ với một lệnh.


Các cách tiếp cận khác có những nhược điểm này:

  • grep -qgrep -s là một bước không cần thiết thêm và không được hỗ trợ ở mọi nơi.
  • /proc/\* không được hỗ trợ ở mọi nơi.
  • mountinfo dựa trên/Proc/..
  • cut -f3 -d' ' làm rối không gian trong tên đường dẫn
  • Phân tích cú pháp mount là khoảng trắng. Bây giờ trang của người đàn ông nói:

.. chế độ liệt kê được duy trì để chỉ tương thích ngược.

Để đầu ra mạnh mẽ hơn và có thể tùy chỉnh hơn, hãy sử dụng findmnt (8), đặc biệt là trong các tập lệnh của bạn.


Hàm Bash :

#These functions return exit codes: 0 = found, 1 = not found

isMounted    () { findmnt -rno SOURCE,TARGET "$1" >/dev/null;} #path or device
isDevMounted () { findmnt -rno SOURCE        "$1" >/dev/null;} #device only
isPathMounted() { findmnt -rno        TARGET "$1" >/dev/null;} #path   only

#where: -r = --raw, -n = --noheadings, -o = --output

Ví dụ sử dụng :

if isPathMounted "/mnt/foo bar";      #Spaces in path names are ok.
   then echo "path is mounted"
   else echo "path is not mounted"
fi

if isDevMounted "/dev/sdb4"; 
   then echo "device is mounted"
   else echo "device is not mounted"
fi

#Universal:
if isMounted "/mnt/foo bar"; 
   then echo "device is mounted"
   else echo "device is not mounted"
fi

if isMounted "/dev/sdb4";
   then echo "device is mounted"
   else echo "device is not mounted"
fi
21
Elliptical view

Một kịch bản như thế này sẽ không bao giờ được di động. Một bí mật bẩn thỉu trong unix là chỉ hạt nhân mới biết hệ thống tập tin đang ở đâu và thiếu những thứ như/Proc (không di động), nó sẽ không bao giờ cho bạn câu trả lời thẳng.

Tôi thường sử dụng df để khám phá điểm gắn kết của thư mục con là gì và hệ thống tập tin trong đó là gì.

Chẳng hạn (yêu cầu Shell posix như ash/AT & T ksh/bash/etc)

case $(df  $mount)
in
  $(df  /)) echo $mount is not mounted ;;
  *) echo $mount has a non-root filesystem mounted on it ;;
esac

Kinda cho bạn biết thông tin hữu ích.

7
chris

sau đây là những gì tôi sử dụng trong một trong những công việc định kỳ sao lưu rsync của mình. nó kiểm tra xem/sao lưu có được gắn hay không và cố gắn nó nếu không (nó có thể bị lỗi vì ổ đĩa nằm trong khoang trao đổi nóng và thậm chí có thể không có trong hệ thống)

LƯU Ý: phần sau chỉ hoạt động trên linux, vì nó greps/Proc/mounts - một phiên bản di động hơn sẽ chạy 'mount | grep/backup ', như trong câu trả lời của Matthew ..

  nếu ! grep -q/sao lưu/Proc/gắn kết; sau đó nếu ! gắn kết/sao lưu; sau đó [.__.] echo "thất bại" [.__.] thoát 1 [.__.] fi [.__.] fi [.__.] echo "thành công." [.__.] # làm công cụ ở đây 
6
cas

Vì để gắn kết, dù sao bạn cũng cần phải có một thư mục, được gắn kết, chiến lược của tôi là luôn tạo một tệp không có thật với một tên tệp lạ sẽ không bao giờ được sử dụng và chỉ cần kiểm tra sự tồn tại của nó. Nếu tập tin ở đó, thì không có gì được gắn vào vị trí đó ...

Tôi không nghĩ rằng nó hoạt động để gắn ổ đĩa mạng hoặc những thứ tương tự. Tôi đã sử dụng nó cho các ổ đĩa flash.

2
Brian Postow

Làm thế nào về việc so sánh số lượng thiết bị? Tôi chỉ đang cố nghĩ về cách bí truyền ..

#!/bin/bash
if [[ $(stat -c "%d" /mnt) -ne $(stat -c "%d" /mnt/foo) ]]; then
    echo "Somethin mounted there I reckon"
fi

Có một lỗ hổng trong logic của tôi với điều đó ...

Là một chức năng:

#!/usr/bin/bash
function somethingMounted {
        mountpoint="$1"
        if ! device1=$(stat -c "%d" $mountpoint); then
                echo "Error on stat of mount point, maybe file doesn't exist?" 1>&2
                return 1
        fi
        if ! device2=$(stat -c "%d" $mountpoint/..); then
                echo "Error on stat one level up from mount point, maybe file doesn't exist?" 1>&2
                return 1
        fi

        if [[ $device1 -ne $device2 ]]; then
                #echo "Somethin mounted there I reckon"
                return 0
        else
                #echo "Nothin mounted it seems"
                return 1
        fi
}

if somethingMounted /tmp; then
        echo "Yup"
fi

Các thông báo lỗi echo có thể là dư thừa, bởi vì stat cũng sẽ hiển thị lỗi.

2
Kyle Brandt

Xin lỗi vì đã đưa nó lên nhưng tôi nghĩ nó khá hữu ích:

if awk '{print $2}' /proc/mounts | grep -qs "^/backup$"; then
    echo "It's mounted."
else
    echo "It's not mounted."
fi

Điều này nhận được cột thứ 2 của/Proc/mounts (cột thứ 2 = điểm gắn kết).

Sau đó, nó greps đầu ra. Lưu ý ^ và $, điều này ngăn/sao lưu khớp/mnt/sao lưu hoặc/sao lưu cũ, v.v.

1
David

Không ai trong số này thỏa mãn trường hợp sử dụng trong đó một thư mục đã cho là thư mục con trong một điểm gắn kết khác. Ví dụ: bạn có thể có/thứ gắn kết NFS với Host:/real_thing. Sử dụng grep cho mục đích này trên/Proc/mounts/etc/mtab hoặc 'mount' sẽ không hoạt động, bởi vì bạn sẽ tìm kiếm một điểm gắn kết không tồn tại. Ví dụ:/thing/thingy không phải là điểm gắn kết, nhưng/thing được gắn trên Host:/real_thing. Câu trả lời tốt nhất được bình chọn ở đây thực sự KHÔNG phải là "cách tốt nhất để xác định xem thư mục/volumne có được gắn không". Tôi sẽ bỏ phiếu ủng hộ bằng cách sử dụng 'df -P' (-P chế độ tiêu chuẩn POSIX) làm chiến lược sạch hơn:

dev=`df -P /thing/thingy | awk 'BEGIN {e=1} $NF ~ /^\/.+/ { e=0 ; print $1 ; exit } END { exit e }'` && {
    echo "Mounted via: $dev"
} || {
    echo "Not mounted"
}

Đầu ra từ việc chạy này sẽ là:

Mounted via: Host:/real_thing

Nếu bạn muốn biết điểm gắn kết thực sự là gì, không có vấn đề gì:

mp=`df -P /thing/thingy | awk 'BEGIN {e=1} $NF ~ /^\/.+/ { e=0 ; print $NF ; exit } END { exit e }'` && {
    echo "Mounted on: $mp"
} || {
    echo "Not mounted"
}

Đầu ra từ lệnh đó sẽ là:

Mounted on: /thing

Điều này rất hữu ích nếu bạn đang cố gắng tạo ra một số loại chroot phản chiếu các điểm gắn bên ngoài chroot, trong chroot, thông qua một số thư mục hoặc danh sách tệp tùy ý.

1
Craig

Phụ thuộc vào những gì bạn biết về âm lượng bạn đang kiểm tra.

Trong trường hợp cụ thể mà tôi đã nghiên cứu gần đây, nơi tôi quan tâm để tìm xem một ổ đĩa flash cụ thể đã được gắn chưa, công việc nào dễ dàng nhất là kiểm tra sự tồn tại của/dev/đĩa/by-nhãn /. Nếu thiết bị được cắm, tập lệnh udev đảm bảo liên kết tồn tại (và nó bị xóa khi rút phích cắm thiết bị).

(Tuy nhiên, đây KHÔNG phải là một câu trả lời có tính di động cao; nó hoạt động trên nhiều bản phân phối Linux hiện đại và câu hỏi được gắn thẻ cho Linux và đó là một cách tiếp cận hoàn toàn khác với bất kỳ điều gì được đề cập cho đến khi nó mở rộng các khả năng.)

0
David Dyer-Bennet

Tôi thích câu trả lời sử dụng /proc/mounts, nhưng tôi không thích làm một grep đơn giản. Điều đó có thể cung cấp cho bạn dương tính giả. Điều bạn thực sự muốn biết là "làm bất kỳ hàng nào có chuỗi chính xác này cho trường số 2". Vì vậy, hãy hỏi câu hỏi đó. (trong trường hợp này tôi đang kiểm tra /opt)

awk -v status=1 '$2 == "/opt" {status=0} END {exit status}' /proc/mounts

# and you can use it in and if like so:

if awk -v status=1 '$2 == "/opt" {status=0} END {exit status}' /proc/mounts; then
  echo "yes"
else
  echo "no"
fi
0
Bruno Bronosky

Mặc dù đây là một câu hỏi của Linux, tại sao không làm cho nó di động khi nó được thực hiện dễ dàng?

Trang hướng dẫn của grep nói:

Các tập lệnh Shell di động phải tránh cả -q và -s và nên chuyển hướng đầu ra tiêu chuẩn và lỗi sang /dev/null thay thế.

Vì vậy, tôi đề xuất giải pháp sau đây:

if grep /mnt/foo /proc/mounts > /dev/null 2>&1; then
        echo "Mounted"
else
        echo "NOT mounted"
fi
0
fex

grep/etc/mtab cho điểm gắn kết của bạn có thể?

0
Ophidian

Có cần phải phức tạp hơn thế này không?

mount \
    | cut -f 3 -d ' ' \
    | grep -q /mnt/foo \
  && echo "mounted" || echo "not mounted"
0
Matthew Bloch

Điều này?:

volume="/media/storage"
if mount|grep $volume; then
echo "mounted"
else
echo "not mounted"
if

Từ: Một diễn đàn Ubunt

0
RateControl

Tạo tập tin theo mountpoint của bạn như check_mount và sau đó chỉ kiểm tra nếu nó tồn tại?

if [[ -f /something/check_mount ]]; then
   echo "Mounted
   RC=$?
else
   Echo "Not mounted"
   RC=0
fi
exit $RC
0
Wiljami