कैसे पता लगाएं कि ड्राइव में सीडी-रोम है या नहीं?


4

मैं अपने सीडी-रोम डिवाइस ( /dev/sr0) को जानता हूं लेकिन मैं एक स्क्रिप्ट से कैसे पता लगा सकता हूं कि ड्राइव खाली है या उसमें कोई डिस्क है या नहीं?


जवाबों:


8

आप कमांड का उपयोग करके किसी भी ब्लॉक डिवाइस के बारे में जानकारी प्राप्त कर सकते हैं 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

4
ब्लकिड विभाजन का पता लगाता है, अगर मैं एक ऑडियो सीडी डालता हूं, तो इसका पता नहीं लगाया जाता है। नहीं में वर्णित के रूप ioctl का उपयोग कर एक कार्यक्रम बनाने की तुलना में एक आसान समाधान मिला stackoverflow.com/questions/15652520/...
BatchyX

1
blkidसीडी / डीवीडी ड्राइव को बंद करने का कारण बनता है। मुझे लगता है कि कुछ जांच कर सकता है कि क्या थाली पहले खुली / बंद है, मुझे लगता है। एक बार (एक व्यक्ति द्वारा) बंद कर दिया, तो यह देखने के लिए समझ में आता है कि क्या मीडिया मौजूद है। उस पर कोई विचार?
होगा

3

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

2

आप पायथन 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)

2

आप 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

-> मीडिया लोड है।

सूचना: मैंने ऑडियो और खाली सीडी के साथ यह कोशिश नहीं की, लेकिन मेरा मानना ​​है कि परिणाम समान होगा।


1

डिवाइस को माउंट करने का प्रयास करें।

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?
SHW

एक रिक्त सीडी माउंट होने में विफल हो जाएगी, इसलिए माउंट का उपयोग करना वास्तव में काम नहीं करता है। एक टूटी हुई सीडी भी माउंट होने में विफल रहेगी, लेकिन यह ड्राइव में मौजूद है।
.तिने

1

इस शेल-स्क्रिप्टिंग दृष्टिकोण के साथ मुद्दा यह है कि शेल कमांड, माउंट, 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

0

यहां शेल स्क्रिप्ट है जिसका उपयोग मैं अपने उद्देश्यों के लिए करता हूं। यह आंशिक रूप से एलन के उत्तर पर आधारित है ।

इसके पीछे तर्क मूल रूप से यह है कि मैं इसका उपयोग करके एक विस्तारित शेल कमांड में उपयोग कर रहा था &&और इसे डिवाइस को माउंट करने के लिए तैयार होने की प्रतीक्षा करने की आवश्यकता थी।

#!/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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.