是否有命令可以检测 CD 抽屉是打开还是关闭?

是否有命令可以检测 CD 抽屉是打开还是关闭?

是否有一个可以在 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它会告诉您托盘是否已关闭且有磁盘存在。

相关内容