GNU/Linux >> Linux の 問題 >  >> Linux

ドライブに CD-ROM があるかどうかを検出する方法は?

コマンド 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

ディスクを取り出しても何も出力されず、終了値は 2 です (0 は成功を意味します。0 以外の値は通常、何か異常が発生したか、エラーが発生したことを意味します)

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

setcd -i (setcd で パッケージ (少なくとも Debian では) は、ドライブの状態を教えてくれます。他のいくつかのアプローチ (少なくともマウント、おそらく blkid も) とは異なり、これはしません トレイを閉じようとする 、それが可能なドライブでも。 (ディスクを挿入しているときに接近しようとすると、非常に厄介です)。

トレイを開いた状態:

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

トレイを閉じた直後:

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

準備ができたら:

$ 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

閉じていますが、ディスクはありません:

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

かなり簡単にスクリプト化できます:

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

Python3 と標準ライブラリを使用すると、次のことができます:

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. LinuxソフトウェアRAIDで故障したハードディスクを交換する方法

  2. Linuxは複数の連続したパスセパレーター(/ home //// username /// file)をどのように処理しますか?

  3. Linux:/ dev / console、/ dev / tty、/ dev / tty0の違いは?

  1. / dev / stdin、/ dev / stdout、および/ dev / stderrはどの程度移植可能ですか?

  2. / dev/randomと/dev/ urandomをいつ使用するか?

  3. cronジョブを/dev/ null /に完全に沈黙させる方法は?

  1. Linux – / dev / urandomで「u」という文字は何を意味しますか?

  2. バックグラウンドでアプリケーションの出力を /dev/null にリダイレクトする方法

  3. /dev/sda と /dev/sdb をどのように交換しますか?