2013-09-02 24 views
5

Tôi đang làm việc trên tập lệnh bash cần xem cho ngăn chứa CD được đóng theo cách thủ công. Các ổ đĩa là slimline vì vậy nó không có động cơ mở/đóng. Tôi cần theo dõi điều gì để hiển thị trạng thái của ngăn kéo hoặc sự kiện đóng của nó?Xác định khi nào ngăn kéo cd đã bị đóng

Tôi đang chạy máy chủ Ubuntu 12.04.

Trả lời

0

Bạn có thể phân tích cú pháp /var/log/messages cho các sự kiện ascpi.

Ngoài ra kiểm tra dbus-monitor mà làm việc trong Ubuntu

+0

Tôi tin/var/log/thư đã bị xóa khỏi Ubuntu một vài bản phát hành trước. Các bản ghi được chứa trong/var/log/messages đã được chuyển đến/var/log/syslog ngoại trừ không có nhiều chi tiết. Tôi không tin rằng sự kiện ascpi được bao gồm. Đối với màn hình dbus, nó cần một môi trường X11 phải không? – user2740987

4

Bạn có thể sử dụng giải thích các ngôn ngữ như Perl, Python, hoặc Ruby để gọi một ioctl hạt nhân cho các truy vấn tình trạng ổ đĩa.

function check_disk_tray_perl { 
    perl -e 'use POSIX; sysopen(FD, $ARGV[0], O_RDONLY|O_NONBLOCK) || die "Failed to open device ${ARGV[0]}\n"; my $r = ioctl(FD, 0x5326, 0); exit ($r > 0 ? $r & 0x01 ? 0 : 1 : 2);' "$1" 
} 

function check_disk_tray_ruby { 
    ruby -e 'require "fcntl"; dev = ARGV[0]; begin fd = IO::sysopen(dev, Fcntl::O_RDONLY|Fcntl::O_NONBLOCK); io = IO.new(fd); rescue; $stderr.puts "Failed to open device #{dev}."; exit 2; end; r = io.ioctl(0x5326, 0); exit (r > 0 ? (r & 0x01) == 1 ? 0 : 1 : 2);' "$1" 
} 

function check_disk_tray_python { 
    python -c 'import os, sys, fcntl 
dev = str(sys.argv[1]) 
try: 
    fd = os.open(dev, os.O_RDONLY|os.O_NONBLOCK) 
except: 
    sys.stderr.write("Failed to open device " + dev + ".\n") 
    exit(2) 
r = fcntl.ioctl(fd, 0x5326, 0) 
os.close(fd) 
exit(2 if (r <= 0) else 0 if (r & 1) else 1) 
' "$1" 
} 

Bạn cũng có thể biên dịch mã với gcc trên runtime:

function check_disk_tray_gcc { 
    local OUTPUT_BINARY="/tmp/check_disk_tray_gcc_$((RANDOM))" 
    local FLAGS=(-O2 -pipe -fomit-frame-pointer) 
    local R 

    gcc "${FLAGS[@]}" -o "$OUTPUT_BINARY" -xc - <<EOF 
#include <stdio.h> 
#include <sys/ioctl.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <linux/cdrom.h> 

int main(int argc, char** argv) 
{ 
    if (argc != 2) { 
     fprintf(stderr, "Invalid number of arguments.\n"); 
     return 2; 
    } 

    char* file = argv[1]; 

    int fd = open(file, O_RDONLY|O_NONBLOCK); 

    if (fd < 0) { 
     fprintf(stderr, "Failed to open file %s.\n", file); 
     return 2; 
    } 

    int r = ioctl(fd, CDROM_DRIVE_STATUS, 0); 

    return (r > 0 ? r & 1 ? 0 : 1 : 2); 
} 
EOF 

    if [[ $? -ne 0 || ! -f "$OUTPUT_BINARY" ]]; then 
     R=2 
    else 
     "$OUTPUT_BINARY" "$1" 
     R=$? 
    fi 

    rm -f "$OUTPUT_BINARY" 

    return "$R" 
} 

chức năng Wrapper:

function check_disk_tray { 
    if type -P perl >/dev/null; then 
     check_disk_tray_perl "$1" 
    elif type -P ruby >/dev/null; then 
     check_disk_tray_ruby "$1" 
    elif type -P python >/dev/null; then 
     check_disk_tray_python "$1" 
    elif type -P gcc >/dev/null; then 
     check_disk_tray_gcc "$1" 
    else 
     echo "No tool usable for checking disk tray." >&2 
     return 2 
    fi 
} 

Ví dụ sử dụng:

#!/bin/bash 

# ---- Place the above codes here. ---- 

check_disk_tray "$(readlink -f /dev/cdrom)" 
case "$?" in 
0) 
    echo "Tray is closed." 
    ;; 
1) 
    echo "Tray is open." 
    ;; 
2|*) 
    echo "General failure." 
    ;; 
esac 
+0

Tôi đã có thể làm việc này tuy nhiên tôi phải thay thế 'dev = str (sys.argv [1])' với 'dev = str ("/dev/cdrom ")' – user2740987

+0

@ user2740987 Tôi đã thử python script một lần nữa và nó làm việc chưa sửa đổi. Có vấn đề gì thế? – konsolebox

Các vấn đề liên quan