ตรวจสอบว่าไดเร็กทอรีติดตั้งด้วย bash หรือไม่


95

ฉันใช้

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

ฉันต้องการตรวจสอบ /foo/barด้วยสคริปต์ทุบตีและดูว่าถูกเมาท์หรือไม่? ถ้าไม่เช่นนั้นให้เรียกใช้คำสั่ง mount ด้านบนทำอย่างอื่น ฉันจะทำเช่นนี้ได้อย่างไร?

CentOS คือระบบปฏิบัติการ


อย่างเช่น "if [[$ (mount -l ... | fgrep ... | wc -l)]]; then ... "
bobah

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

คำตอบ:


70

การรันmountคำสั่งโดยไม่มีอาร์กิวเมนต์จะบอกให้คุณทราบถึงการติดตั้งปัจจุบัน จากเชลล์สคริปต์คุณสามารถตรวจสอบจุดเชื่อมต่อด้วยgrepและคำสั่ง if:

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

ในตัวอย่างของฉันคำสั่ง if กำลังตรวจสอบรหัสทางออกของgrepซึ่งระบุว่ามีการจับคู่หรือไม่ /dev/nullเพราะผมไม่ต้องการออกไปจะแสดงเมื่อมีการแข่งขันผมเปลี่ยนเส้นทางไปยัง


4
คุณไม่จำเป็นต้องตรวจสอบว่าส่งคืนสตริงหรือไม่ grepส่งคืนสถานะการออกที่ไม่ใช่ศูนย์หากไม่มีรายการที่ตรงกัน ไม่จำเป็นต้องทำการทดสอบหรือ subshell ที่สร้างโดย $ () if command | grep -q 'stuff'; then ...
jordanm

32
สิ่งนี้ใช้ไม่ได้กับการผูกเมาท์ดังนั้นจึงไม่ควรยอมรับเป็นคำตอบ คำตอบนี้ควรถูกลงคะแนน คุณไม่สามารถขึ้นอยู่กับการmount | grep ...แสดงให้คุณเห็นว่าการผูกเมาท์ของคุณยังคงทำงานอยู่ หากไม่ได้ต่อเชื่อมอุปกรณ์พื้นฐานและติดตั้งใหม่การเชื่อมต่อการเชื่อมต่อจะไม่เชื่อมต่อทั้งสองไฟล์ / ไดเรกทอรีแม้ว่าจะmountยังแสดงว่าเชื่อมต่ออยู่ก็ตาม และถ้าคุณทำumount ...มันจะบอกคุณว่ามันไม่ได้เมาท์แม้ว่าmountมันจะบอกว่ามันเป็น ข้อบกพร่องมากมายในระบบไฟล์ linux
Dev Null

@DevNull: ฉันมีปัญหาที่คุณอธิบายไว้ วิธีแก้ปัญหานี้หรือไม่?
Isaac

@Isaac ขออภัยในความล่าช้าในการตอบกลับ ฉันจะลองใช้readlink -fซึ่งไม่ส่งคืนอะไรเลยเมื่อไม่มีเส้นทาง / ไฟล์ หากไม่มี / mount / path / to_file ที่อยู่ภายใต้ (ต่อลิงก์สำหรับอ่าน) การเชื่อมต่อที่อยู่ภายใต้จะพัง (ต่อเชื่อมต่อระหว่างการเชื่อมต่อและการเชื่อมต่อ) หากไฟล์ต้นแบบอยู่ที่นั่นและreadlink -fระบุว่าไม่มีเวอร์ชันการเชื่อมโยงของไฟล์นั้นการเชื่อมจะเสียเพียงแค่ต่อเชื่อมการโยงใหม่
Dev Null

2
หากมีการเรียกเมาท์/mnt/md0xxxคำสั่งจะระบุ/mnt/md0ว่าเมาท์ในขณะที่สิ่งที่ไม่จำเป็นต้องเป็น ...
เดวิดแอล

184

คุณไม่ได้กังวลที่จะพูดถึง O / S

Ubuntu Linux 11.10 (และอาจเป็นเวอร์ชันล่าสุดของ Linux) มีmountpointคำสั่ง

นี่คือตัวอย่างบนเซิร์ฟเวอร์ของฉัน:

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

จริงๆแล้วในกรณีของคุณคุณควรจะใช้-qตัวเลือกนี้ได้:

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

หวังว่าจะช่วยได้


7
คุณมีบางอย่างที่ติดตั้งอยู่ในขณะที่คุณรันคำสั่ง 'mountpoint' หรือไม่? แม้ว่าจะตั้งใจให้เป็นจุดเชื่อมต่อเว้นแต่ว่าจะมีบางอย่างที่ติดตั้งอยู่จริงแต่ก็เป็นเพียงไดเรกทอรีเท่านั้น
Mark J. Bobak

2
+1 ใช้ได้กับ Ubuntu 10.10 เช่นกัน จะได้รับในอูบุนตูตั้งแต่ 8.04
l0b0

3
mountpoint มีอยู่ใน RHEL 6.3 ด้วย (อาจจะเป็นรุ่นก่อนหน้านี้)
Joril

2
mountpoint มีอยู่และทำงานบน Debian 7 ("Wheezy") และ UCS 4 ได้อย่างสมบูรณ์แบบเช่นกัน
Lahmizzar

7
ตามที่กล่าวไว้ในจุดเชื่อมต่อความคิดเห็นอื่นไม่ทำงานกับการเชื่อมต่อแบบผูก ตัวอย่างข้อมูลจะติดตั้ง dir หลายครั้ง
csanchez

42

คู่มือmountpointบอกว่า:

ตรวจสอบว่าไดเร็กทอรีหรือไฟล์ที่ระบุถูกกล่าวถึงในไฟล์ / proc / self / mountinfo

คู่มือmountกล่าวว่า:

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

ดังนั้นคำสั่งที่ถูกต้องในการใช้คือfindmntซึ่งเป็นส่วนหนึ่งของutil-linuxแพ็คเกจและตามคู่มือ:

สามารถค้นหาใน / etc / fstab, / etc / mtab หรือ / proc / self / mountinfo

mountpointดังนั้นมันเป็นจริงการค้นหาสิ่งที่มากกว่า นอกจากนี้ยังมีตัวเลือกที่สะดวก:

-M, - นับ เส้นทางนับ

กำหนดไฟล์ mountpoint หรือไดเร็กทอรีอย่างชัดเจน โปรดดูที่ - เป้าหมาย

โดยสรุปเพื่อตรวจสอบว่าไดเร็กทอรีถูกเมาท์ด้วย bash หรือไม่คุณสามารถใช้:

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

ตัวอย่าง:

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

ฉันชอบคำตอบที่ใช้/proc/mountsแต่ฉันไม่ชอบทำ grep ง่ายๆ นั่นสามารถให้ผลบวกปลอม สิ่งที่คุณจริงๆต้องการทราบว่าเป็น "ดำเนินการใด ๆ แถวที่มีสตริงตรงนี้จำนวนสาขา 2" ดังนั้นถามคำถามนั้น (ในกรณีนี้ฉันกำลังตรวจสอบ/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
น่ารักขนาดนี้! สิ่งที่คุณต้องการอย่างแม่นยำสำหรับระบบฝังตัวขนาดเล็กที่ไม่มีเครื่องมือฉูดฉาดเหมือนmountpointหรือfindmntมีอยู่จริง ตอบกลับง่ายมากมีความสุขมาก UNIX เช่นนี้ :)
troglobit

1

วิธีแก้ปัญหาของฉัน:

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

ตัวอย่าง:

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

สำหรับคำตอบของมาร์คเจ Bobak ของ , mountpointไม่ทำงานหากติดกับbindตัวเลือกในระบบแฟ้มที่แตกต่างกัน

สำหรับคำตอบของ Christopher Neylanไม่จำเป็นต้องเปลี่ยนเส้นทางเอาต์พุตของ grep ไปที่ / dev / null เพียงแค่ใช้grep -qแทน

ที่สำคัญที่สุดกำหนดเส้นทางโดยใช้readlink -f $mypath :

  • หากคุณตรวจสอบเส้นทางเช่น/path/to/dir/ลงท้ายด้วยแบ็กสแลชเส้นทางใน/proc/mountsหรือmountเอาต์พุตคือ/path/to/dir
  • ในรุ่นลินุกซ์มากที่สุด/var/run/คือ symlink ของ/run/ดังนั้นหากคุณติดผูกสำหรับ/var/run/mypathและตรวจสอบว่ามันติดมันจะแสดงเป็นใน/run/mypath/proc/mounts

2
ฉันคิดว่า "grep -q" $ path "/ proc / mounts" (มีช่องว่าง) ดีกว่า ... ไม่งั้น is_mount ab จะคืนค่าจริงถ้าเมาท์ abc?!
alfonx

0

วิธีอื่นที่สะอาดก็เป็นเช่นนั้น:

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

แน่นอนว่า 'echo something' สามารถทดแทนได้ด้วยสิ่งที่คุณต้องทำในแต่ละกรณี


นี่กำลังทำสิ่งเดียวกันกับคำตอบของ @ ChristopherNeylan
Jonathan H

0

คำตอบที่นี่ซับซ้อนเกินไปเพียงตรวจสอบว่ามีเมาท์อยู่หรือไม่โดยใช้:

cat /proc/mounts | tail -n 1

สิ่งนี้จะส่งออกเฉพาะโฟลเดอร์ที่ติดตั้งสุดท้ายหากคุณต้องการดูทั้งหมดเพียงแค่ลบคำสั่ง tail


-4

ใน. bashrc ของฉันฉันสร้างนามแฝงต่อไปนี้:

alias disk-list="sudo fdisk -l"

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