เป็นวิธีที่ดีที่สุด (เชื่อถือได้พกพา ฯลฯ ) เพื่อตรวจสอบว่าโฟลเดอร์ที่กำหนดอยู่ในระบบไฟล์ระยะไกลติดตั้ง (NFS) ภายในเปลือกสคริปต์คืออะไร?
ฉันกำลังมองหาคำสั่งที่จะมีลักษณะ:
chk-remote-mountpoint /my/path/to/folder
เป็นวิธีที่ดีที่สุด (เชื่อถือได้พกพา ฯลฯ ) เพื่อตรวจสอบว่าโฟลเดอร์ที่กำหนดอยู่ในระบบไฟล์ระยะไกลติดตั้ง (NFS) ภายในเปลือกสคริปต์คืออะไร?
ฉันกำลังมองหาคำสั่งที่จะมีลักษณะ:
chk-remote-mountpoint /my/path/to/folder
คำตอบ:
ในขณะที่สเตฟานกล่าวว่า "ไม่มีคำตอบ Unix สากล"
ทางออกที่ดีที่สุดที่ฉันได้พบกับคำถามของฉัน:
df -P -T /my/path/to/folder | tail -n +2 | awk '{print $2}'
จะกลับชนิดของระบบแฟ้มตัวอย่างเช่น: หรือnfs
ext3
-T
ตัวเลือกที่ไม่ได้มาตรฐานดังนั้นจึงอาจไม่ทำงานในระบบอื่น ๆ Unix / Linux ...
ตามความเห็นของGilles 'ด้านล่าง: "ใช้งานได้บน Linux ที่ไม่ได้ฝัง แต่ไม่ได้อยู่ใน BusyBox, * BSD, ฯลฯ "
/etc/mtab
หรือผลลัพธ์mount
แทนการใช้df
สามารถทำได้ในบางกรณี
/proc/mounts
mount
หรือ/etc/mtab
ไม่ได้/proc/mounts
มาตรฐานจึงมีการรับประกันที่ไม่มีในสิ่งที่อาจจะพบว่ามี ...
-T
มีความหมายแตกต่างกันที่นี่
คุณสามารถใช้ stat
GNU
%m
เพื่อหาจุดเมานต์
$ stat --format=%m /usr/src/linux
/usr/src
%T
(ในโหมดระบบไฟล์) เพื่อค้นหาชื่อของระบบไฟล์
$ stat --file-system --format=%T /usr/src/linux
reiserfs
ดังนั้นคุณรู้ว่า/usr/src/linux
ในระบบของฉันถูกเก็บไว้ในระบบแฟ้มที่ติดตั้งอยู่บนและมีประเภทระบบแฟ้ม/usr/src
reiserfs
ยังอ้างถึงman stat
สำหรับการอ้างอิงเพิ่มเติม มันเป็นคำสั่งที่ใช้งานได้หลากหลายมีประโยชน์เกือบทุกครั้งที่คุณต้องการข้อมูลเกี่ยวกับไฟล์และไม่ต้องการถอยกลับไปสู่grep | awk
วอร์ด
stat
ไม่มี%m
ตัวเลือกสำหรับ--format
(ใช้ Debian Squeeze, coreutils 8.5) ดังนั้นฉันเดาว่าโซลูชันนี้ไม่น่าเชื่อถือมาก
2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a file
coreutils: เกือบ 3 ปีที่แล้ว น่าประหลาดใจที่เดเบียนยังไม่มีสิ่งนี้
mount -l
และการใช้งานgrep
, sed
หรือawk
จะหาบรรทัดที่หมายถึงไดเรกทอรีในคำถาม
/my/path/to/the/directory
จริง ๆ แล้วมีบางอย่างจากจุดเมานท์/my/path
พร้อมคำตอบ บางทีคุณอาจจะสามารถให้รายละเอียดบางอย่างเพิ่มเติมเกี่ยวกับgrep
, sed
, awk
คำสั่งที่คุณแนะนำ (คำตอบที่สมบูรณ์) ?.
mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'
ควรให้รายการของจุดเชื่อมต่อ nfs ทั้งหมดบนระบบ
mount | fgrep "`stat --printf=" on %m type" /var/log/`". The
คำสั่งstat: mount` จะพิมพ์จุดเมานต์ทั้งหมดใน<device> on <mountpoint> type <type>
รูปแบบ เพื่อ grep นี้ฉันได้stat --printf
สร้างon <mountpoint> type
ส่วน
น่าเสียดายที่ Unix ไม่มีคำตอบสากล
สิ่งหนึ่งที่คุณสามารถทำได้สำหรับไฟล์ที่กำหนด/a/b/c/d
คือการเดินไปตามเส้นทาง:
... และทำstat(2)
ในแต่ละระดับจนกว่าจะมีst_dev
การเปลี่ยนแปลง จากนั้นคุณจะรู้ว่าจุดต่อคืออะไร จากนั้นคุณสามารถค้นหาพา ธ แบบบัญญัติของจุดเมานต์นั้นใน/etc/mtab
หรือในผลลัพธ์ของmount
เพื่อค้นหาประเภทระบบไฟล์ จากนั้นหาสิ่งที่อยู่ห่างไกลและสิ่งที่จะไม่ยุ่งยากโดยเฉพาะอย่างยิ่งสำหรับคนประเภทฟิวส์ ยกตัวอย่างเช่นnfs
, cifs
, fuse.sshfs
, fuse.davfs
ที่เห็นได้ชัด แต่สิ่งที่เกี่ยวกับตัวอย่างfuse.gvfs-fuse-daemon
หรือfuse.avfsd
ว่าสามารถมีได้ทั้งไฟล์เครือข่ายและนอกเครือข่าย?
stat(2)
ฉันคิดว่าคุณกำลังอ้างถึงฟังก์ชั่น C แต่ฉันใช้เชลล์ อย่างไรก็ตามst_dev
อ้างอิงถึง ID อุปกรณ์หลักและรอง (เป็น Linux เฉพาะหรือไม่) และคำสั่งเชลล์stat(1)
มี (ไม่ใช่มาตรฐาน) %t
และ%T
มี--format
ตัวเลือกสำหรับหมายเลขหลักและรองตามลำดับแต่จะส่งกลับ "0" (local และ nfs เสมอ) ) ฉันลองใช้ Debian Squeeze และ Lenny
--file-system
ตัวเลือกนี้หรือไม่?
--file-system
มันมีความหมายอื่นถ้าใช้กับ
"-l" ถึง df (1) จะล้มเหลวโดยมีข้อผิดพลาดในระบบไฟล์ที่ไม่ได้อยู่ในระบบดังนั้นคุณสามารถใช้ลักษณะการทำงานนี้เพื่อทราบว่าระบบไฟล์นั้นเป็นระยะไกลหรือไม่:
df -l /path 2> /dev/null | grep -q "File"
rc=$?
if [ "$rc" = "0" ]
then
echo "local mount, do stuff"
fi
df
จะล้มเหลวและเพียงอย่างเดียวทำให้นี่เป็นคำตอบที่ไม่ดีนัก แต่ก็พยายามตอบคำถามดังนั้นฉันจึงไม่เห็นว่าทำไมคุณถึงเรียกมันว่า "ไม่ใช่คำตอบ"
df /path
จะบอกคุณว่าเป็นจุดติดถ้ามันบอกว่าติดประเด็นก็คือไม่ได้/path
/
แค่ทำ
df /me/path/to/folder
หากฟิลด์แรก (ระบบไฟล์) อยู่ในรูปแบบโฮสต์: / path คุณจะรู้ว่าเป็น NFS
คุณสามารถใช้df -t
บน Linux และdf -T
บนระบบ BSD
จากผู้ชาย df :
-t, --type = TYPE
จำกัด รายการไปยังระบบไฟล์ประเภท TYPE
if df -t nfs | grep -q /path/to/folder$; then
# it is an NFS
fi
-t
ตัวเลือกนั้นมีความหมายแตกต่างกันใน POSIX / SUS ดังนั้นการใช้ตัวเลือกนี้อาจให้ผลลัพธ์ที่ไม่สอดคล้องกันในเวอร์ชันต่าง ๆ บนเครื่องมือ / UNIX
ฉันจะใช้เป็นการส่วนตัวmountpoint
(พกพาได้บน Linux!):
NAME
mountpoint - see if a directory is a mountpoint
SYNOPSIS
mountpoint [-d|-q] directory
หรือshowmount
ต้องการติดตั้งบนระบบใด ๆ ที่ติดตั้งการNFS
แชร์ (ส่วนหนึ่งของnfs-common
แพ็คเกจ):
NAME
showmount - show mount information for an NFS server
SYNOPSIS
showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]
ตัวเลือกอื่นจะเป็น someting เช่น:
$ mount -l -t nfs | grep 'my mount point'
mountpoint
เป็นมาตรฐานในกรณีนี้
find . -type d -name nfs -exec mountpoint {} \; | grep not
จะตรวจสอบโฟลเดอร์ทั้งหมดที่ชื่อ 'nfs' หากพวกเขาถูกเมาท์
nfs
ไม่ได้มองหาโฟลเดอร์ชื่อ