我知道我的CD-ROM设备( /dev/sr0
)但是如何从脚本中检测到驱动器是否为空或者是否有磁盘?
我知道我的CD-ROM设备( /dev/sr0
)但是如何从脚本中检测到驱动器是否为空或者是否有磁盘?
Answers:
您可以使用该命令获取有关任何块设备的信息 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
导致CD / DVD驱动器关闭。我想要一些可以检查盘片是否先打开/关闭的东西。一旦关闭(由一个人),那么看看是否存在媒体是有意义的。 有什么想法吗?
您可以尝试使用lsblk命令:
lsblk -fp
如果在FSTYPE下用于行/ dev / sr0则没有 - >媒体未加载到cdrom驱动器。 如果在FSTYPE下有什么东西,可能是iso9660 - >媒体被加载到cdrom驱动器中。
另外,我认为最简单的方法:
cat /dev/sr0 | head -1
如果输出是:
cat: /dev/sr0: No medium found
- >没有媒体加载。
如果输出是这样的:
cat: /dev/sr0: No medium found
- >媒体已加载。
注意:我没有尝试使用音频或空cds,但我相信结果会是一样的。
尝试安装设备。
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
?
这种shell脚本方法的问题在于,没有任何shell命令mount,lsblk,blkid可以等待/阻止/暂停并确定cdrom是否报告“找不到介质”,因为托盘刚刚关闭并且正在初始化本身要读取CD,或者因为设备中没有CD,并且“将找不到介质”将永远报告。因此,您可以选择合理数量的尝试在放弃之前以某个休眠间隔对cdrom设备进行纠缠,如下面的shell脚本中所示,或者您可以使用一些ioctl调用编写一段c代码,并从中获取一些信息cdrom,直接通过内核。
#!/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
这是我用于自己目的的shell脚本。它部分基于 艾伦 的答案。
它背后的原因基本上是我在扩展的shell命令中使用它 &&
并需要它等待设备准备好安装。
#!/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
您可以使用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)