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