Existe um comando que detecta se a gaveta do CD está aberta ou fechada?

5

Existe um comando que você pode executar em um script de shell que detectaria se a bandeja do CD estava aberta ou fechada, e retornaria 1 ou 0 dependendo se era (ou algo fácil de interpretar)?

Atualmente, estou executando o comando open e calculando quanto tempo demora para executar. Se é quase instantâneo, está aberto. Se levar tempo, ele foi aberto e agora está fechado.

Eu gostaria de um método que não envolva alterar o estado atual - apenas detectá-lo.

    
por Tim 15.06.2014 / 15:12

2 respostas

9

Encontrei uma pequena solução aqui . O código C abaixo, minimamente alterado do site vinculado, retornará um código de saída de 0 se a bandeja estiver aberta e 1 , se não estiver.

Portanto, salve este código como algo (por exemplo, foo.c ) e compile-o com este comando:

gcc -o trayopen foo.c

Em seguida, copie o executável compilado, trayopen to /usr/bin :

sudo cp trayopen /usr/bin

Você não deve ser capaz de fazer coisas como

trayopen /dev/sr0 && echo closed

Ou mais completo:

#!/bin/sh
if trayopen /dev/sr0
then
    echo "Tray is open."
else
    echo "Tray is closed."
fi

O código:

#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);
}
    
por terdon 15.06.2014 / 19:09
3

Baseado no código C de @ terdon, escrevi uma versão em 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)

É claro que poderia usar algum tipo de amor por comentários e manipulação de argumentos do cmdline, mas se você precisar de uma versão do Python ... isso funcionará.

Observe também que o módulo CDROM pode ser específico do Linux e que nem todas as unidades suportam a consulta (por exemplo, o ioctl () retornará CDS_NO_INFO ).

Existem outras constantes CDROM.CDS_* que fornecem variantes úteis. Em particular, CDS_DISK_OK dirá se a bandeja está fechada e tem um disco presente.

    
por gstein 07.04.2018 / 03:39