Есть ли команда, которую вы можете запустить в сценарии оболочки, которая будет определять, открыт ли лоток для компакт-дисков или возвращать 1 или 0, в зависимости от того, было ли это (или что-то легко интерпретировать)?
В настоящее время я выполняю команду открытия и определяю время, необходимое для выполнения. Если это почти мгновенно, это открыто. Если это занимает время, оно было открыто и теперь закрыто.
Мне бы хотелось, чтобы метод не включал изменение текущего состояния - просто его обнаружение.
Я нашел миленькое решение здесь. Код 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);
}
На основе кода C @terdon я записал версию в 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)
Очевидно, это могло использовать некоторую любовь к комментариям и cmdline обработке аргумента, но если Вам будет нужна версия Python, то... это будет работать.
Также обратите внимание что CDROM
модуль может быть определенным для Linux, и что не вся поддержка дисков, запрашивающая (например, ioctl () возвратится CDS_NO_INFO
).
Существуют другие CDROM.CDS_*
константы, которые обеспечивают полезные варианты. В частности, CDS_DISK_OK
скажет Вам, если лоток будет закрыт и будет иметь существующий диск.