मैं अपने सीडी-रोम डिवाइस ( /dev/sr0
) को जानता हूं लेकिन मैं एक स्क्रिप्ट से कैसे पता लगा सकता हूं कि ड्राइव खाली है या उसमें कोई डिस्क है या नहीं?
मैं अपने सीडी-रोम डिवाइस ( /dev/sr0
) को जानता हूं लेकिन मैं एक स्क्रिप्ट से कैसे पता लगा सकता हूं कि ड्राइव खाली है या उसमें कोई डिस्क है या नहीं?
जवाबों:
आप कमांड का उपयोग करके किसी भी ब्लॉक डिवाइस के बारे में जानकारी प्राप्त कर सकते हैं blkid
।
[root@arch32-vm ~]# blkid /dev/sr0
/dev/sr0: UUID="2013-05-31-23-04-19-00" LABEL="ARCH_201306" TYPE="iso9660" PTTYPE="dos"
[root@arch32-vm ~]# echo $?
0
यदि मैं डिस्क को हटाता हूं, तो मुझे कोई आउटपुट नहीं मिलता है और बाहर निकलने का मूल्य 2. है (0 का मतलब है सफलता। एक गैर-शून्य मान का मतलब आमतौर पर कुछ असामान्य घटना या त्रुटि हुई होगी)
[root@arch32-vm ~]# blkid /dev/sr0
[root@arch32-vm ~]# echo $?
2
blkid
सीडी / डीवीडी ड्राइव को बंद करने का कारण बनता है। मुझे लगता है कि कुछ जांच कर सकता है कि क्या थाली पहले खुली / बंद है, मुझे लगता है। एक बार (एक व्यक्ति द्वारा) बंद कर दिया, तो यह देखने के लिए समझ में आता है कि क्या मीडिया मौजूद है। उस पर कोई विचार?
setcd -i
( setcd
पैकेज में, कम से कम डेबियन पर) आपको ड्राइव की स्थिति बता सकता है। कुछ अन्य दृष्टिकोणों के विपरीत (माउंट कम से कम, शायद ब्लकिड भी), यह ट्रे को बंद करने का प्रयास नहीं करेगा , यहां तक कि इसके लिए सक्षम ड्राइव पर भी। (यदि आप एक डिस्क डाल रहे हैं तो यह वास्तव में कष्टप्रद है क्योंकि यह आपको बंद करने की कोशिश करता है)।
ट्रे के साथ खुला:
$ setcd -i / dev / sr0 / Dev / sr0: सीडी ट्रे खुली है
ट्रे को बंद करने के ठीक बाद:
$ setcd -i / dev / sr0 / Dev / sr0: ड्राइव तैयार नहीं है
इसके तैयार होने के बाद:
$ setcd -i / dev / sr0 / Dev / sr0: डिस्क ड्राइव में मिली: डेटा डिस्क टाइप 1 वॉल्यूम का नाम: «नाम» प्रकाशक: MKISOFS ISO 9660 / HFS FILESYSTEM BUILDER & CDRECORD CD-R / DVD CREATOR (C) 1993 E.YOUNGDALE (C) 1997 J.PEARSON / J.SCHILLING 2003030913034700700200509130307007000000000000000000000000000000 डेटा तैयार करने वाला: MKISOFS ISO 9660 / HFS FILESYSTEM BUILDER और CDRECORD CD-R / DVD CREATOR (C) 1993 E.YOUNGDALE (C) 1997 J.PEARSON / J.SCHILL 200003091307007002005091303070070000000000000000000000000000000000।
बंद, लेकिन कोई डिस्क नहीं:
$ setcd -i / dev / sr0 / Dev / sr0: कोई डिस्क नहीं डाली गई है
आप इसे आसानी से लिख सकते हैं:
while true; do
cdinfo=$(setcd -i "$dev")
case "$cdinfo" in
*'Disc found'*)
break;
;;
*'not ready'*)
echo '(waiting for drive to be ready)' >&2;
sleep 3;
;;
*'is open'*)
echo '(drive is open)' >&2;
sleep 5;
;;
*)
printf 'Confused by setcd -i, bailing out:\n%s\n' "$cdinfo" &2
exit 1
esac
done
आप पायथन 3 और मानक पुस्तकालय के साथ निम्नलिखित कर सकते हैं:
import fcntl
import os
CDROM_DRIVE = '/dev/sr0'
def detect_tray(CDROM_DRIVE):
"""detect_tray reads status of the CDROM_DRIVE.
Statuses:
1 = no disk in tray
2 = tray open
3 = reading tray
4 = disk in tray
"""
fd = os.open(CDROM_DRIVE, os.O_RDONLY | os.O_NONBLOCK)
rv = fcntl.ioctl(fd, 0x5326)
os.close(fd)
print(rv)
आप lsblk कमांड के साथ कोशिश कर सकते हैं:
lsblk -fp
अगर लाइन / dev / sr0 के लिए FSTYPE के तहत कुछ भी नहीं है -> मीडिया cdrom ड्राइव में लोड नहीं है। अगर FSTYPE के तहत कुछ है, तो शायद iso9660 -> मीडिया को cdrom ड्राइव में लोड किया जाता है।
दूसरा, मुझे सबसे सरल तरीका लगता है:
cat /dev/sr0 | head -1
यदि आउटपुट है:
cat: /dev/sr0: No medium found
-> कोई मीडिया लोड नहीं हुआ।
अगर आउटपुट कुछ भी हो लेकिन यह:
cat: /dev/sr0: No medium found
-> मीडिया लोड है।
सूचना: मैंने ऑडियो और खाली सीडी के साथ यह कोशिश नहीं की, लेकिन मेरा मानना है कि परिणाम समान होगा।
डिवाइस को माउंट करने का प्रयास करें।
mount -t iso9660 /dev/sr0 /mnt/cdrom
फिर वापसी मूल्य $ जांचें?
यदि रिटर्न 0 है, "अच्छा" तो डिस्क मौजूद थी। एल्स, यह "1" या कुछ भी अच्छा नहीं बल्कि "0" लौटाएगा
इसलिए चुपचाप जाँच करने के लिए, मैं इसे लिपिबद्ध करूँगा।
cdrom_mount=0
mount -t iso9660 /dev/sr0 /mnt/cdrom >/dev/null 2>&1
if [[ $? -gt 0 ]]
then
cdrom_mount=true
else
cdrom_mount=false
fi
यह एक बहुत ही सरल उदाहरण है, लेकिन आप कुछ ऐसा ही कर सकते हैं ...
-gt
होना चाहिए -eq
?
इस शेल-स्क्रिप्टिंग दृष्टिकोण के साथ मुद्दा यह है कि शेल कमांड, माउंट, lsblk, blkid, में से कोई भी इंतजार नहीं कर सकता / ब्लॉक / रोक सकता है और निर्धारित कर सकता है कि क्या कोई cdrom "कोई माध्यम नहीं मिला" रिपोर्ट कर रहा है क्योंकि ट्रे अभी बंद है और यह प्रारंभिक है सीडी को पढ़ने के लिए स्वयं, या क्योंकि डिवाइस में कोई सीडी नहीं है, और "कोई माध्यम नहीं मिला" हमेशा के लिए रिपोर्ट किया जाएगा। तो आप सोने से पहले एक निश्चित नींद के अंतराल पर cdrom डिवाइस को ठीक करने की कोशिश कर सकते हैं, जैसा कि नीचे दी गई स्क्रिप्ट में है, या आप कुछ ioctl कॉल के साथ c कोड का एक टुकड़ा लिख सकते हैं, और कुछ जानकारी प्राप्त कर सकते हैं सीडीआरएम, सीधे कर्नेल के माध्यम से।
#!/bin/sh
# cd.close
#
# Close the CD-ROM tray, and mount the CD-ROM device:
#
# mount status codes: see man mount(8)
# ------------------------------------
# 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 (in the case of mount -a)
CDROM=/dev/sr0
TRIES="1 2 3"
INTERVAL=5
MOUNT=0
TOKENS=( $TRIES )
STOP=${TOKENS[-1]}
for i in $TRIES; do
echo close: ATTEMPT $i of $STOP
output=`mount $CDROM -t iso9660 /cdrom 2>&1`
status=$?
echo mount: OUTPUT $output
echo mount: STATUS $status
if [ $status -eq 0 ]; then
MOUNT=1
break
else
if [[ "$output" =~ "already mounted" ]]; then
MOUNT=1
break
fi
fi
if [ $i -eq $STOP ]; then
break
fi
echo sleep: $INTERVAL SECONDS...
sleep $INTERVAL
done
if [ $MOUNT -eq 1 ]; then
echo final: MOUNTED $CDROM
printf "final: LABEL "
volname $CDROM
else
echo final: NO MEDIUM
fi
यहां शेल स्क्रिप्ट है जिसका उपयोग मैं अपने उद्देश्यों के लिए करता हूं। यह आंशिक रूप से एलन के उत्तर पर आधारित है ।
इसके पीछे तर्क मूल रूप से यह है कि मैं इसका उपयोग करके एक विस्तारित शेल कमांड में उपयोग कर रहा था &&
और इसे डिवाइस को माउंट करने के लिए तैयार होने की प्रतीक्षा करने की आवश्यकता थी।
#!/bin/bash
# mountdvd:
# A shell script to wait until the optical drive can be mounted.
#
# Important Notes:
# - By default, this will wait about 10 seconds for the drive to finish reading a newly
# inserted disk.
# - Works best already be given a mount point in /etc/fstab
# - Works best if fs type is set to auto
# - Assumes /etc/fstab allows user to mount device
#
# Example /etc/fstab listing:
# /dev/cdrom /media/dvd auto nofail,auto,user,exec,utf8,noatime,ro,uid=plex,gid=pi 0 0
# Command name
COMMAND=`basename $0`
# Device to mount
DVD_DEVICE=/dev/cdrom
MOUNT_POINT=/media/dvd
# Number of attempts before giving up (Total time = ATTEMPTS * WAIT_TIME, default: 10 seconds)
ATTEMPTS=20
# Wait time in seconds
WAIT_TIME=0.5
# Check if already mounted first
MOUTPUT=`mountpoint -q $MOUNT_POINT`
MSTATUS=$?
if [ $MSTATUS -eq 0 ]; then
echo "$COMMAND: $DVD_DEVICE was already mounted."
exit 0
fi
#for ATTEMPT in {1..$ATTEMPTS}
while [ $ATTEMPTS -gt 0 ];
do
# Attempt to mount device
OUTPUT=`mount $DVD_DEVICE 2>&1`
STATUS=$?
if [ $STATUS -eq 0 ]; then
# Device mounted
exit 0
else
# Double check here, just in case earlier check failed.
if [[ "$OUTPUT" =~ "already mounted" ]]; then
# Device was already mounted
echo "$COMMAND: $DVD_DEVICE was already mounted."
exit 0
fi
fi
if [ $ATTEMPTS -ne 1 ]; then
# Wait a moment before trying again.
sleep $WAIT_TIME
fi
let ATTEMPTS=ATTEMPTS-1
done
echo "$COMMAND: ERROR: Unable to mount $DVD_DEVICE."
exit 1