Làm cách nào để kiểm tra xem hệ thống tập tin có được gắn với tập lệnh không


19

Tôi mới tham gia viết kịch bản ... Tôi có thể làm những thứ rất cơ bản, nhưng bây giờ tôi cần một bàn tay.

Tôi có một hệ thống tập tin cục bộ sẽ chỉ được gắn kết khi tôi cần sao lưu.

Tôi đang bắt đầu với điều này.

#!/bin/bash
export MOUNT=/myfilesystem

if grep -qs $MOUNT /proc/mounts; then
  echo "It's mounted."
else
  echo "It's not mounted."; then
  mount $MOUNT;
fi

Như tôi đã nói, tôi rất cơ bản trong việc viết kịch bản. Tôi nghe nói rằng bạn có thể kiểm tra trạng thái của mountlệnh bằng cách xem mã trả về.

RETURN CODES
       mount has the following return codes (the bits can be ORed):
       0      success
       1      incorrect invocation or permissions
       2      system error (out of memory, cannot fork, no more loop devices)
       4      internal mount bug
       8      user interrupt
       16     problems writing or locking /etc/mtab
       32     mount failure
       64     some mount succeeded

Tôi không biết làm thế nào để kiểm tra điều đó. Có hướng dẫn nào không?


2
Bạn có một lủng lẳng hài hước ; thentrong kịch bản của bạn.
Mat

tại sao chúng ta xuất var MOUNT và cũng xóa ";"
Mike Q

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

Câu trả lời:


19

Bạn có thể kiểm tra mã trạng thái của mount, và hầu hết các tệp thực thi được viết tốt, với tham số đặc biệt shell ?.

Từ man bash:

? Expands to the exit status of the most recently executed foreground pipeline.

Sau khi bạn chạy mountlệnh, thực thi ngay lập tức echo $?sẽ in mã trạng thái từ lệnh trước đó.

# mount /dev/dvd1 /mnt
  mount: no medium found on /dev/sr0
# echo $?
  32

Không phải tất cả các thực thi có mã trạng thái được xác định rõ. Tối thiểu, nó sẽ thoát với mã thành công (0) hoặc thất bại (1), nhưng không phải lúc nào cũng như vậy.

Để mở rộng (và chính xác) tập lệnh mẫu của bạn, tôi đã thêm một ifcấu trúc lồng nhau cho rõ ràng. Đây không phải là cách duy nhất để kiểm tra mã trạng thái và thực hiện một hành động, nhưng nó dễ đọc nhất khi học.

#!/bin/bash
mount="/myfilesystem"

if grep -qs "$mount" /proc/mounts; then
  echo "It's mounted."
else
  echo "It's not mounted."
  mount "$mount"
  if [ $? -eq 0 ]; then
   echo "Mount success!"
  else
   echo "Something went wrong with the mount..."
  fi
fi

Để biết thêm thông tin về "Thoát và thoát trạng thái", bạn có thể tham khảo Hướng dẫn về Bash-Scripting nâng cao .


1
Không cần phải xuất khẩu $MOUNT. Kịch bản này cũng sẽ bị hỏng nếu hệ thống tập tin có bất kỳ ký tự nào trải qua quá trình ghép chữ (dấu cách, v.v.). Bạn nên luôn luôn trích dẫn mở rộng của bạn.
Chris Xuống

@ChrisDown Bạn nói đúng. Tôi chỉ xóa sự lơ lửng rõ ràng '; sau đó'. Trong tương lai, vui lòng chỉnh sửa câu trả lời của tôi để làm cho nó chính xác hơn.
George M

Ơ ... cái này vẫn sẽ vỡ. Bạn vẫn chưa trích dẫn mở rộng. Theo lời khuyên của bạn, tôi sẽ làm ngay bây giờ.
Chris Xuống

Tôi cũng không khuyên bạn nên liên kết với hướng dẫn kịch bản Bash "Nâng cao" khét tiếng, nó đầy lỗi và sẽ dạy mọi người viết lỗi chứ không phải kịch bản. BashGuide là một sự thay thế tốt hơn nhiều.
Chris Xuống

2
@ChrisDown "Chia tách từ sẽ ăn em bé của bạn nếu bạn không trích dẫn mọi thứ đúng cách." Từ để sống bằng.
George M

35

Nhiều bản phân phối Linux có mountpointlệnh. Nó có thể được sử dụng rõ ràng để kiểm tra nếu một thư mục là một mountpoint. Đơn giản như thế này:

#!/bin/bash    
if mountpoint -q "$1"; then
    echo "$1 is a mountpoint"
else
    echo "$1 is not a mountpoint"
fi

1
Cách tiếp cận này sẽ thất bại nếu bạn cố kiểm tra một bảng mã, vì bạn sẽ vấp phải một lỗi bị từ chối cấp phép, khi được chạy bởi người dùng không phải là root.
chối S.

Giải pháp của tôi hoạt động với encfs.
Theodore R. Smith

3

Một cách nữa:

if findmnt ${mount_point}) >/dev/null 2>&1 ; then
  #Do something for positive result (exit 0)
else
  #Do something for negative result (exit 1)
fi

Xin chào @sungtm; có vẻ như bạn đã đăng nhập bằng một tài khoản mới, riêng biệt. Vì tài khoản "Mặt trời" của bạn không có nhiều hoạt động, tôi sẽ đề nghị bạn tiếp tục sử dụng tài khoản "sungtm" mới của mình, vì điều đó đơn giản hơn. Tuy nhiên, nếu bạn muốn hợp nhất các tài khoản, hãy cho tôi biết bằng cách gắn cờ nhận xét này và chúng tôi sẽ liên hệ với nhóm Stack Exchange. Cảm ơn bạn!
Jeff Schaller

Lưu ý rằng đối với các bảng mã, findmntphải được cung cấp với tham số --source encfs, nếu không, nó sẽ luôn xem thư mục sẽ được gắn kết vì nó rơi trở lại giá trị cha.
Burkart

2

Cách dễ nhất mà không yêu cầu root là:

if $(df | grep -q /mnt/ramdisk); then

fi

hoặc để xem nếu nó không được gắn kết:

if ! $(df | grep -q /mnt/ramdisk); then

fi

các mountlệnh không cần truy cập root, dflà tập trung vào không gian đĩa không vào điểm lắp ...
Philippe Gachoud

1

Báo cáo ngắn

Kiểm tra nếu được gắn kết :

mount|grep -q "/mnt/data" && echo "/mnt/data is mounted; I can follow my job!"

Kiểm tra nếu không được gắn kết :

mount|grep -q "/mnt/data" || echo "/mnt/data is not mounted I could probably mount it!"

0

Tôi đã thử với kịch bản dưới đây

#!/bin/bash
echo "enter the file system to check whether its mounted or not"
read p
echo $p
for i in `cat /proc/mounts`
do
if [[ $p =~ $i ]]
then
echo "$p is mounted"
else
echo "$p is not mounted"
fi
done

Chỉ đầu vào bạn cần cung cấp là tên của hệ thống tập tin

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.