วิธีตรวจสอบว่าระบบไฟล์ติดตั้งด้วยสคริปต์หรือไม่


19

ฉันใหม่ในการเขียนสคริปต์ ... ฉันสามารถทำสิ่งพื้นฐานมาก แต่ตอนนี้ฉันต้องการมือ

ฉันมีระบบไฟล์ในตัวเครื่องซึ่งจะติดตั้งเมื่อฉันต้องสำรองข้อมูลเท่านั้น

ฉันเริ่มต้นด้วยสิ่งนี้

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

อย่างที่ฉันพูดฉันว่าพื้นฐานในการเขียนสคริปต์ ฉันได้ยินมาว่าคุณสามารถตรวจสอบสถานะของmountคำสั่งได้โดยดูที่รหัสส่งคืน

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

ฉันไม่รู้วิธีตรวจสอบ คำแนะนำใด ๆ


2
คุณมีห้อยที่ตลก; thenในสคริปต์ของคุณ
Mat

เหตุใดเราจึงส่งออก MOUNT var และลบ ";"
Mike Q

คำถามที่คล้ายกันอยู่บนเซิร์ฟเวอร์ Fault , Stack มากเกินและUnix และ Linux Stack แลกเปลี่ยน
sasha

คำตอบ:


19

คุณสามารถตรวจสอบรหัสสถานะของmountและดีที่สุด executables ?เขียนด้วยพารามิเตอร์เปลือกพิเศษ

จากman bash:

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

หลังจากที่คุณเรียกใช้mountคำสั่งการดำเนินการในทันทีecho $?จะพิมพ์รหัสสถานะจากคำสั่งก่อนหน้า

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

ไม่ใช่ executables ทั้งหมดที่กำหนดรหัสสถานะไว้อย่างดี อย่างน้อยก็ควรออกด้วยรหัสสำเร็จ (0) หรือความล้มเหลว (1) แต่นั่นไม่ใช่กรณีเสมอไป

หากต้องการขยาย (และแก้ไข) สคริปต์ตัวอย่างของคุณฉันได้เพิ่มโครงสร้างซ้อนifเพื่อความชัดเจน ไม่ใช่วิธีเดียวที่จะทดสอบรหัสสถานะและดำเนินการ แต่เป็นวิธีที่ง่ายที่สุดในการอ่านเมื่อเรียนรู้

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

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ "จบการทำงานและออกจากสถานะ" คุณสามารถดูที่ขั้นสูงทุบตี Scripting คู่มือ


1
$MOUNTไม่จำเป็นต้องมีการส่งออกไม่ได้ สคริปต์นี้จะหยุดทำงานหากระบบไฟล์มีอักขระใด ๆ ที่จะได้รับ wordplitting (ช่องว่าง ฯลฯ ) คุณควรเสมอพูดขยายของคุณ
Chris Down

@ChrisDown คุณพูดถูก ฉันลบเฉพาะห้อยที่ชัดเจน '; แล้ว' ในอนาคตรู้สึกอิสระที่จะแก้ไขคำตอบของฉันเพื่อให้ถูกต้องมากขึ้น
George M

เอ่อ ... สิ่งนี้จะยังคงพัง คุณยังไม่ได้อ้างถึงการขยาย ตามคำแนะนำของคุณฉันจะทำทันที
Chris Down

ฉันยังไม่แนะนำให้เชื่อมโยงไปยังคู่มือสคริปต์ Bash "ขั้นสูง" ที่น่าอับอายมันเต็มไปด้วยข้อผิดพลาดและจะสอนให้ผู้คนเขียนข้อผิดพลาดไม่ใช่สคริปต์ BashGuideเป็นทางเลือกที่ดีกว่ามาก
Chris Down

2
@ChrisDown "การแยกคำจะกินลูกน้อยของคุณถ้าคุณไม่พูดสิ่งที่ถูกต้อง" คำที่จะมีชีวิตอยู่โดย
George M

35

Linux distros จำนวนมากมีmountpointคำสั่ง มันสามารถใช้อย่างชัดเจนเพื่อตรวจสอบว่าไดเรกทอรีเป็นจุดติดตั้ง ง่ายเหมือนนี้

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

1
วิธีการนี้จะล้มเหลวหากคุณพยายามตรวจสอบการเข้ารหัสเนื่องจากคุณจะพบข้อผิดพลาดที่ถูกปฏิเสธสิทธิ์เมื่อทำงานโดยผู้ใช้ที่ไม่ใช่รูท
Denys S.

โซลูชันของฉันทำงานร่วมกับ encfs
Theodore R. Smith

3

อีกวิธีหนึ่ง:

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

สวัสดี @ Sungtm; ดูเหมือนว่าคุณเข้าสู่ระบบด้วยบัญชีใหม่แยกต่างหาก เนื่องจากบัญชี"Sun"ของคุณไม่มีกิจกรรมมากฉันขอแนะนำให้คุณใช้บัญชี"sungtm"ใหม่ของคุณต่อไปเนื่องจากง่ายกว่า อย่างไรก็ตามหากคุณต้องการรวมบัญชีโปรดแจ้งให้เราทราบโดยการตั้งค่าสถานะความคิดเห็นนี้และเราจะติดต่อทีมงาน Stack Exchange ขอขอบคุณ!
Jeff Schaller

โปรดทราบว่าสำหรับการเข้ารหัสfindmntจะต้องมาพร้อมกับพารามิเตอร์--source encfsมิฉะนั้นจะพิจารณาไดเรกทอรีที่จะติดตั้งเพราะมันกลับไปที่แม่เมานต์
Burkart

2

วิธีที่ง่ายที่สุดที่ไม่ต้องใช้รูทคือ:

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

fi

หรือเพื่อดูว่ายังไม่ได้ติดตั้ง:

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

fi

mountคำสั่งไม่จำเป็นต้องเข้าถึงรากdfมุ่งเน้นไปที่พื้นที่ดิสก์ไม่ได้อยู่ในจุดเมา ...
ฟิลิปป์ Gachoud

1

ข้อความสั้น ๆ

ตรวจสอบว่าติดตั้งแล้ว :

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

ตรวจสอบว่าไม่ได้ติดตั้ง :

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

0

ฉันลองด้วยสคริปต์ด้านล่าง

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

อินพุตที่คุณต้องระบุเท่านั้นคือชื่อของระบบไฟล์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.