Thông báo về các thay đổi trên một tập tin dưới / Proc


13

Tôi đã viết một 'daemon' nhỏ trong bash sẽ chuyển sang tai nghe nếu chúng được phát hiện và nếu không, hãy chuyển sang loa USB bên ngoài với PulseAudio.

Những gì tôi đang tìm kiếm là một số cách để nhận thông báo về các thay đổi trên tệp /proc/asound/card0/codec#0, giống như inotifywaittrên các tệp thực (coi các tệp trong / Proc là "tệp giả").

Tôi tìm thấy mã của tôi một chút điên rồ, bởi vì nó chạy sleep 1với awkcho cả ngày, có nghĩa là 86400 lần một ngày :)

while sleep 1; do
    _1=${_2:-}
    _2=$(awk '/Pin-ctls/{n++;if(n==4)print}' '/proc/asound/card0/codec#0')

    [[ ${_1:-} = $_2 ]] ||
        if [[ $_2 =~ OUT ]]; then
            use_speakers
        else
            use_internal
        fi
done

Những gì tôi đang tìm kiếm là một cái gì đó như (ví dụ này không hoạt động):

codec=/proc/asound/card0/codec#0
while inotifywait $codec; do
    if [[ $(awk '/Pin-ctls/{n++;if(n==4)print}' $codec) =~ OUT ]]; then
        use_speakers
    else
        use_internal
    fi
done

Bằng cách này, các lệnh bên trong vòng lặp sẽ chỉ được chạy khi có những thay đổi thực sự trên $codectệp.


1
Điều đó không điên rồ - những thứ như topvà màn hình hệ thống GUI đọc nhiều hơn thế so với /procnhững khoảng thời gian ngắn. Tất nhiên, họ có thể làm điều đó hiệu quả hơn nhiều khi thực thi được biên dịch, nhưng vấn đề là: bỏ phiếu cho thông tin là một nhiệm vụ phổ biến.
goldilocks

2
Vì vấn đề cơ bản không phải là duy nhất đối với bạn, tôi hy vọng sẽ có một giải pháp được tạo sẵn (ít nhất là đối với một số phần cứng) - hãy xem unix.stackexchange.com/questions/25776/ Thẻsuperuser.com/questions / 339900 / Lọ . Nguồn cuối cùng dĩ nhiên là cây nhân (và thông số kỹ thuật phần cứng nếu bạn quyết định triển khai nó vào một số trình điều khiển).
peterph

1
Nếu điều này xuất hiện /proc, có lẽ bạn có thể kích hoạt tập lệnh của mình bằng quy tắc udev , điều này sẽ khá lý tưởng. Ít lý tưởng hơn là làm thế nào tẻ nhạt có thể đến với các quy tắc udev;)
goldilocks

@peterph Từ những gì tôi có thể thu thập, hda-verb cung cấp giao diện để cài đặt hoặc kiểm tra các tham số, nhưng có vẻ như tôi cũng sẽ phải chạy nó mỗi giây.
Teresa e Junior

@goldilocks Cắm tai nghe không gửi bất kỳ sự kiện udev nào. Hoặc là tôi còn thiếu gì nữa?
Teresa e Junior

Câu trả lời:


10

Những gì tôi đang tìm kiếm là một số cách để nhận thông báo về các thay đổi trên tệp [in Proc]

Bạn không thể, bởi vì chúng không phải là tập tin. Đây không phải là một câu hỏi trùng lặp, nhưng câu trả lời ở đây giải thích tại sao.

/proclà một giao diện kernel. Không có tập tin thực sự ở đó, do đó họ không thể thay đổi. Đọc từ tay cầm là một yêu cầu và dữ liệu trong tệp khi bạn đọc nó là một câu trả lời cho điều đó.

Cách duy nhất bạn có thể mô phỏng một cái gì đó như thế này là đọc tệp theo chu kỳ và so sánh nội dung để xem liệu trả lời từ kernel đã thay đổi - có vẻ như bạn đã làm điều đó.

Nếu bạn statcài đặt các tệp, thời gian và thời gian sẽ giống nhau: đối với một số tệp, đó là bất cứ khi nào có lệnh gọi, trong thời gian khác, trong khi khởi động hệ thống. Trong trường hợp đầu tiên, nó dường như sẽ luôn thay đổi, trong lần thứ hai, nó dường như sẽ không bao giờ thay đổi.


Thật không may, thậm chí bỏ phiếu nó mỗi giây thêm một độ trễ đáng kể (ví dụ: 500ms). Tôi hy vọng sẽ có một cách nhanh hơn / hiệu quả hơn để làm điều này, nhưng vì bạn đã đề cập rằng các ứng dụng như top làm theo cách tương tự, tôi nghĩ rằng tôi sẽ để nó theo cách đó.
Teresa e Junior

@TeresaeJunior Nếu độ trễ là một vấn đề (tôi nghĩ nó không có ở đây), ví dụ: vì thời lượng của cuộc thăm dò được sử dụng trong một phép tính, bạn sẽ tính thời gian thực tế (và không chỉ sử dụng thời gian bạn yêu cầu ngủ) . Điều đó có vẻ như rất nhiều mặc dù; Tôi chưa bao giờ mô tả kịch bản bash vì vậy tôi không biết điều gì sẽ bình thường ở đây (hmm ... câu hỏi riêng biệt tốt). Gọi awk == fork()và những thứ như thế là đắt tiền; các tiện ích được viết bằng C, như đã đề cập, có các phương thức nhanh hơn. Tôi vẫn không nghĩ rằng bạn đang thêm nhiều tải cho hệ thống tho.
goldilocks

1
Không, xin lỗi, tôi thực sự có nghĩa là: từ khi tôi cắm tai nghe cho đến khi ngủ tiếp theo có một số độ trễ đáng chú ý. Nhưng tôi không có kế hoạch giảm thời gian ngủ. Cảm ơn bạn đã giúp đỡ!
Teresa e Junior

4

Nếu bạn đang sử dụng PulseAudio, hãy pactl subscribelàm điều này.


Vâng, thực sự! Tôi đã bắt đầu sử dụng nó sau khi biên dịch PA 4.0 vài tháng trước do một số vấn đề về âm thanh. Phiên bản trên Debian Stable là 2.0 (mặc dù họ đã tải lên 4.0 để sao lưu gần đây) và không có subscribephiên bản 2.0.
Teresa e Junior

2

Ngoài ra, hãy nhớ rằng một số tệp theo /proc/giấy phép được theo dõi để thay đổi thông qua bỏ phiếu, ví dụ nếu man procbạn có thể đọc những điều sau đây về/proc/self/mounts tin tệp:

/ Proc / [pid] / mounts (kể từ Linux 2.4.19) Tệp này liệt kê tất cả các hệ thống tệp hiện được gắn trong không gian tên mount của tiến trình (xem mount_namespaces (7)). Định dạng của tệp này được ghi lại trong fstab (5).

Vì phiên bản kernel 2.6.15, tệp này có thể được thăm dò: sau khi mở tệp để đọc, một thay đổi trong tệp này (nghĩa là gắn kết hệ thống tệp hoặc ngắt kết nối) khiến select (2) đánh dấu bộ mô tả tệp là có một điều kiện ngoại lệ và thăm dò ý kiến ​​(2) và epoll_wait (2) đánh dấu tệp là có một sự kiện ưu tiên (POLLPRI). (Trước Linux 2.6.30, một thay đổi trong tệp này được biểu thị bằng bộ mô tả tệp được đánh dấu là có thể đọc được cho chọn (2) và được đánh dấu là có một điều kiện lỗi cho cuộc thăm dò (2) và epoll_wait (2).)

Và đó chính xác là những gì đang được thực hiện trong câu hỏi sau:

/programming/5070801/monitoring-mount-point-changes-via-proc-mounts

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.