GNU/Linux >> Tutoriels Linux >  >> Linux

Comment détecter s'il y a un CD-ROM dans le lecteur ?

Vous pouvez obtenir des informations sur n'importe quel périphérique de bloc à l'aide de la commande blkid .

[[email protected] ~]# blkid /dev/sr0
/dev/sr0: UUID="2013-05-31-23-04-19-00" LABEL="ARCH_201306" TYPE="iso9660" PTTYPE="dos"
[[email protected] ~]# echo $?
0

Si je retire le disque, je n'obtiens aucune sortie et la valeur de sortie est 2. (0 signifie succès. Une valeur différente de zéro signifie généralement qu'un événement anormal s'est produit ou qu'une erreur s'est produite)

[[email protected] ~]# blkid /dev/sr0
[[email protected] ~]# echo $?
2

setcd -i (dans le setcd package, au moins sur Debian) peut vous indiquer l'état du lecteur. Contrairement à certaines des autres approches (mount au moins, probablement blkid aussi), cela ne sera pas essayer de fermer le bac , même sur les disques capables de cela. (Ce qui est vraiment ennuyeux s'il essaie de se refermer sur vous pendant que vous insérez un disque).

Avec le bac ouvert :

$ setcd -i /dev/sr0
/dev/sr0:
  CD tray is open

Juste après avoir fermé le bac :

$ setcd -i /dev/sr0
/dev/sr0:
  Drive is not ready

Une fois prêt :

$ setcd -i /dev/sr0
/dev/sr0:
  Disc found in drive: data disc type 1
    Volume name: «name»
    Publisher:                                                                                                                                                                                                                                                                 MKISOFS ISO 9660/HFS FILESYSTEM BUILDER & CDRECORD CD-R/DVD CREATOR (C) 1993 E.YOUNGDALE (C) 1997 J.PEARSON/J.SCHILLING                                                                                                                        2005030913034700�2005030913034700�0000000000000000
    Data preparer:                                                                                                                                 MKISOFS ISO 9660/HFS FILESYSTEM BUILDER & CDRECORD CD-R/DVD CREATOR (C) 1993 E.YOUNGDALE (C) 1997 J.PEARSON/J.SCHILLING                                                                                                                        2005030913034700�2005030913034700�0000000000000000

Fermé, mais pas de disque :

$ setcd -i /dev/sr0
/dev/sr0:
  No disc is inserted

Vous pouvez le scripter assez facilement :

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

Vous pouvez effectuer les opérations suivantes avec Python3 et la bibliothèque standard :

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)

Linux
  1. Comment remplacer un disque dur défaillant dans un RAID logiciel Linux

  2. Comment générer un mot de passe aléatoire sous Linux en utilisant /dev/random

  3. Comment Linux gère-t-il plusieurs séparateurs de chemins consécutifs (/home////nom d'utilisateur///fichier) ?

  4. Linux :Différence entre /dev/console , /dev/tty et /dev/tty0 ?

  5. Comment encoder en base64 /dev/random ou /dev/urandom ?

Comment puis-je modifier la quantité et la taille des disques RAM Linux (/dev/ram0 - /dev/ram15) ?

Linux :Différence entre /dev/console , /dev/tty et /dev/tty0

noyau :désactiver /dev/kmem et /dev/mem

Comment Linux utilise /dev/tty et /dev/tty0

echo ou print /dev/stdin /dev/stdout /dev/stderr

Pourquoi < ou > sont-ils nécessaires pour utiliser /dev/tcp