Kiểm tra xem thư mục được gắn với bash


94

tôi đang dùng

mount -o bind /some/directory/here /foo/bar

tôi muốn kiểm tra /foo/bar mặc dù bằng một tập lệnh bash và xem nó đã được gắn kết chưa? Nếu không thì gọi lệnh mount ở trên, còn không thì làm cách khác. Tôi có thể làm cái này như thế nào?

CentOS là hệ điều hành.


đại loại như "if [[$ (mount -l ... | fgrep ... | wc -l)]]; then ..."
bobah 23/02/12

Các câu hỏi tương tự có trên Server Fault , Stack OverflowUnix & Linux Stack Exchange .
Sasha

Câu trả lời:


70

Chạy mountlệnh mà không có đối số sẽ cho bạn biết các giá trị gắn kết hiện tại. Từ một tập lệnh shell, bạn có thể kiểm tra điểm gắn kết với grepvà một câu lệnh if:

if mount | grep /mnt/md0 > /dev/null; then
    echo "yay"
else
    echo "nay"
fi

Trong ví dụ của tôi, câu lệnh if đang kiểm tra mã thoát của grep, cho biết liệu có khớp hay không. Vì tôi không muốn đầu ra được hiển thị khi có trận đấu, tôi đang chuyển hướng nó đến /dev/null.


4
Bạn không cần kiểm tra xem nó có trả về một chuỗi hay không. greptrả về trạng thái thoát khác 0 nếu không có kết quả phù hợp nào. Không cần kiểm tra hoặc vỏ con được tạo bởi $ (). if command | grep -q 'stuff'; then ...
jordanm

31
Điều này không hoạt động với liên kết gắn kết và do đó không nên được chấp nhận là câu trả lời. Câu trả lời này nên được bỏ phiếu xuống. Bạn không thể phụ thuộc vào việc mount | grep ...cho bạn thấy rằng liên kết gắn kết của bạn vẫn đang hoạt động. Nếu thiết bị bên dưới được ngắt kết nối và kết nối lại, liên kết gắn kết sẽ thực sự không còn kết nối hai tệp / thư mục nữa mặc dù mountvẫn cho thấy nó được kết nối. Và nếu bạn làm điều umount ...đó thậm chí sẽ cho bạn biết nó không được gắn kết, mặc dù đã mountnói là như vậy. Lỗ hổng lớn trong hệ thống tệp linux.
Dev Null

@DevNull: Tôi đang gặp chính xác vấn đề mà bạn đã mô tả. Có giải pháp nào cho vấn đề này không?
Isaac

@Isaac, xin lỗi vì sự chậm trễ trong phản hồi. Tôi sẽ thử sử dụng readlink -f, nó không trả về gì khi đường dẫn / tệp không tồn tại. Nếu không có / mount / path / to_file bên dưới (mỗi liên kết đọc), thì mount bên dưới đã bị hỏng (gắn lại mount bên dưới và liên kết). Nếu tệp cơ bản ở đó và readlink -fcho biết phiên bản ràng buộc của tệp đó không có ở đó, liên kết bị hỏng, chỉ cần gắn lại ràng buộc.
Dev Null

2
Nếu có một mount gọi /mnt/md0xxxdo đó lệnh sẽ chỉ ra /mnt/md0như gắn trong khi những gì nó không phải là ...
David L.

178

Bạn đã không bận tâm đến một O / S.

Ubuntu Linux 11.10 (và có lẽ là hầu hết các phiên bản mới nhất của Linux) có mountpointlệnh.

Đây là một ví dụ trên một trong các máy chủ của tôi:

$ mountpoint /oracle
/oracle is a mountpoint
$ mountpoint /bin
/bin is not a mountpoint

Trên thực tế, trong trường hợp của bạn, bạn có thể sử dụng -qtùy chọn như sau:

mountpoint -q /foo/bar || mount -o bind /some/directory/here /foo/bar

Hy vọng rằng sẽ giúp.


7
Bạn thực sự có một cái gì đó được gắn kết tại thời điểm bạn chạy lệnh 'mountpoint'? Ngay cả khi nó được dự định là một điểm gắn kết, trừ khi nó thực sự có thứ gì đó được gắn kết, nó chỉ là một thư mục.
Mark J. Bobak

2
+1, cũng hoạt động trên Ubuntu 10.10. Nó đã có trong Ubuntu từ 8.04 .
l0b0

3
mountpoint cũng có trong RHEL 6.3 (thậm chí có thể trong các phiên bản trước đó)
Joril

2
mountpoint hiện có và hoạt động hoàn hảo trên Debian 7 ("Wheezy") và UCS 4
Lahmizzar

7
Như đã đề cập trong một bình luận khác, mountpoint không hoạt động với mount mount. Đoạn sẽ gắn kết dir nhiều lần
csanchez

39

Hướng dẫn sử dụng mountpointnói rằng nó:

kiểm tra xem thư mục hoặc tệp đã cho có được đề cập trong tệp / proc / self / mountinfo hay không.

Hướng dẫn sử dụng mountnói rằng:

Chế độ danh sách chỉ được duy trì để tương thích ngược. Để có đầu ra mạnh mẽ 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.

Vì thế lệnh chính xác để sử dụng làfindmnt , chính nó là một phần của util-linuxgói và theo hướng dẫn sử dụng:

có thể tìm kiếm trong / etc / fstab, / etc / mtab hoặc / proc / self / mountinfo

Vì vậy, nó thực sự tìm kiếm nhiều thứ hơn mountpoint. Nó cũng cung cấp tùy chọn thuận tiện:

-M, --mountpoint đường dẫn điểm số

Xác định rõ ràng thư mục hoặc tệp mountpoint. Xem thêm - mục tiêu.

Tóm lại, để kiểm tra xem một thư mục có được gắn với bash hay không, bạn có thể sử dụng:

if [[ $(findmnt -M "$FOLDER") ]]; then
    echo "Mounted"
else
    echo "Not mounted"
fi

Thí dụ:

mkdir -p /tmp/foo/{a,b}
cd /tmp/foo

sudo mount -o bind a b
touch a/file
ls b/ # should show file
rm -f b/file
ls a/ # should show nothing

[[ $(findmnt -M b) ]] && echo "Mounted"
sudo umount b
[[ $(findmnt -M b) ]] || echo "Unmounted"

2

Tôi thích các câu trả lời sử dụng /proc/mounts, nhưng tôi không thích thực hiện một grep đơn giản. Điều đó có thể cung cấp cho bạn kết quả dương tính giả. Điều bạn thực sự muốn biết là "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 đặt 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

1
Cái này thật đáng yêu! Chính xác những gì bạn muốn cho một hệ thống nhúng nhỏ, nơi không có công cụ hào nhoáng nào thích mountpointhoặc findmnttồn tại. Trả lời rất đơn giản, nhiều niềm vui, UNIX như vậy :)
troglobit

1

Giải pháp của tôi:

is_mount() {
    path=$(readlink -f $1)
    grep -q "$path" /proc/mounts
}

Thí dụ:

is_mount /path/to/var/run/mydir/ || mount --bind /var/run/mydir/ /path/to/var/run/mydir/

Đối với câu trả lời của Mark J. Bobak , mountpointkhông hoạt động nếu gắn kết với bindtùy chọn trong hệ thống tệp khác nhau.

Đối với câu trả lời của Christopher Neylan , không cần phải chuyển hướng đầu ra của grep đến / dev / null, chỉ cần sử dụnggrep -q thay vào đó .

Điều quan trọng nhất, chuẩn hóa đường dẫn bằng cách sử dụngreadlink -f $mypath :

  • Nếu bạn kiểm tra đường dẫn chẳng hạn như /path/to/dir/kết thúc bằng dấu gạch chéo ngược, đường dẫn trong /proc/mountshoặcmount đầu ra là/path/to/dir
  • Trong hầu hết các bản phát hành linux, /var/run/là liên kết biểu tượng của /run/, vì vậy nếu bạn gắn kết liên kết cho /var/run/mypathvà kiểm tra xem nó đã được gắn kết chưa, nó sẽ hiển thị như /run/mypathtrong /proc/mounts.

2
Tôi nghĩ rằng "grep -q" $ path "/ proc / mounts" (có khoảng trắng) thậm chí còn tốt hơn ... Nếu không thì is_mount ab sẽ trả về true nếu abc được gắn kết?!
alfonx

0

Một giải pháp sạch khác là như vậy:

$ mount | grep /dev/sdb1 > /dev/null && echo mounted || echo unmounted

Chắc chắn, 'echo something' có thể được thay thế bằng bất cứ điều gì bạn cần làm cho từng trường hợp.


Điều này đang làm giống hệt như câu trả lời của @ ChristopherNeylan.
Jonathan H

0

Các câu trả lời ở đây quá phức tạp, chỉ cần kiểm tra xem mount có tồn tại hay không bằng cách sử dụng:

cat /proc/mounts | tail -n 1

Thao tác này chỉ xuất ra thư mục được gắn kết cuối cùng, nếu bạn muốn xem tất cả chúng, chỉ cần xóa lệnh tail.


-4

Trong .bashrc của mình, tôi đã đặt bí danh sau:

alias disk-list="sudo fdisk -l"

yêu cầu là về tập lệnh và tốt nhất là tránh sudo và chương trình mà mục tiêu là "thao tác phân vùng đĩa"
bcag2
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.