是否有一个可以在 shell 脚本中运行的命令,可以检测 CD 托盘是打开还是关闭,并根据是否打开或关闭返回 1 或 0(或一些易于解释的内容)?
目前,我正在执行打开命令,并计时执行需要多长时间。如果几乎是即时的,则它处于打开状态。如果需要一些时间,则它处于打开状态,现在处于关闭状态。
我想要一种不涉及改变当前状态的方法——只是检测它。
答案1
我找到了一个很好的解决方案这里。下面的 C 代码与链接的站点略有不同,0
如果托盘打开则返回退出代码,1
否则返回退出代码。
因此,将此代码保存为某些内容(例如foo.c
),然后使用此命令进行编译:
gcc -o trayopen foo.c
然后,将编译后的可执行文件复制trayopen
到/usr/bin
:
sudo cp trayopen /usr/bin
你不应该做这样的事情
trayopen /dev/sr0 && echo closed
或者更完整一点:
#!/bin/sh
if trayopen /dev/sr0
then
echo "Tray is open."
else
echo "Tray is closed."
fi
代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/cdrom.h>
int main(int argc,char **argv) {
int cdrom;
int status=1;
if (! argv[1] ){
printf("Usage : trayopen [device]\n");
printf("Result: Returns a 0 if the tray was open and 1 if it was closed\n");
exit(2);
}
if ((cdrom = open(argv[1],O_RDONLY | O_NONBLOCK)) < 0) {
printf("Unable to open device %s. Provide a device name (/dev/sr0, /dev/cdrom) as a parameter.\n",argv[1]);
exit(2);
}
/* Check CD tray status */
if (ioctl(cdrom,CDROM_DRIVE_STATUS) == CDS_TRAY_OPEN) {
status=0;
}
close(cdrom);
exit(status);
}
答案2
基于@terdon 的 C 代码,我用 Python 编写了一个版本:
#!/usr/bin/python
import os, fcntl, CDROM, sys
def drive_status(drive):
fd = os.open(drive, os.O_RDONLY | os.O_NONBLOCK)
rv = fcntl.ioctl(fd, CDROM.CDROM_DRIVE_STATUS)
os.close(fd)
return rv
sys.exit(drive_status(sys.argv[1]) != CDROM.CDS_TRAY_OPEN)
显然,它可以使用一些注释和命令行参数处理,但如果您需要 Python 版本……它将起作用。
还要注意,该CDROM
模块可能是 Linux 特有的,并且并非所有驱动器都支持查询(例如 ioctl() 将返回CDS_NO_INFO
)。
还有其他CDROM.CDS_*
常量可提供有用的变量。特别是,CDS_DISK_OK
它会告诉您托盘是否已关闭且有磁盘存在。