Повідомте про зміни у файлі під / proc


13

Я написав невеликий "демон" в баші, який перейде на навушники, якщо вони виявлені, а якщо ні, перемкніть на зовнішній динамік USB за допомогою PulseAudio.

Що я шукаю - це певний спосіб отримувати сповіщення про зміни у файлі /proc/asound/card0/codec#0, як inotifywaitі у реальних файлах (розглядаючи файли під / proc як "псевдофайли").

Я знаходжу мій код трохи божевільні, тому що він працює sleep 1з в awkпротягом усього дня, тобто 86400 раз в день :)

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

Я шукаю щось на зразок (цей приклад не працює):

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

Таким чином, команди всередині циклу будуть виконуватися лише тоді, коли у $codecфайлі є реальні зміни .


1
Це не божевільно - такі речі, як topмонітори системи GUI, читають набагато більше, ніж це з /procкоротких інтервалів. Звичайно, вони, ймовірно, роблять це набагато ефективніше, як складені виконавчі файли, але справа в тому, що: опитування інформації є загальним завданням.
goldilocks

2
Оскільки основна проблема не є унікальною для вас, я б очікував, що знайдеться готове рішення (принаймні, для певного обладнання) - подивіться на unix.stackexchange.com/questions/25776/… та superuser.com/questions / 339900 /… . Кінцевим джерелом, звичайно, є дерево ядра (і технічні характеристики, якщо ви вирішили впровадити його в якийсь драйвер).
петерф

1
Якщо це з'явиться в /proc, ви, ймовірно, можете запустити свій сценарій за допомогою правила udev , що було б досить ідеально. Менш ідеальним є те, наскільки нудно можна придумати правила udev;)
goldilocks

@peterph З того, що я міг зібрати, hda-verb надає інтерфейс для встановлення або перевірки параметрів, але схоже, що мені доведеться також запускати його щосекунди.
Teresa e Junior

@goldilocks Підключення навушників не надсилає жодних udev-подій. Або є щось більше, чого я сумую?
Teresa e Junior

Відповіді:


10

Що я шукаю - це спосіб отримати повідомлення про зміни у файлі [in proc]

Ви не можете, бо це не файли. Це не зовсім повторне запитання, але тут відповідь пояснює, чому.

/procє інтерфейсом ядра. Там немає реальних файлів, отже вони не можуть змінюватися. Читання з ручок - це запит, а дані у файлі, коли ви читаєте, це відповідь на це.

Єдиний спосіб, як ви могли б імітувати щось подібне, було б читати файл з інтервалом і порівнювати вміст, щоб побачити, чи змінився відповідь з ядра - схоже, ви це вже зробили.

Якщо ви statобробляєте файли, atime і mtime будуть однаковими: для деяких файлів це завжди, коли був статистичний виклик, для інших - час під час завантаження системи. У першому випадку він завжди буде здаватися, що змінився, у другому він ніколи не здасться, що змінився.


На жаль, навіть опитування його щосекунди додає значну затримку (наприклад, 500 мс). Я сподівався, що це буде швидший / ефективніший спосіб зробити це, але оскільки ви вже згадали, що такі програми, як топ, роблять це так само, я думаю, я покину це так.
Teresa e Junior

@TeresaeJunior Якщо затримка - це проблема (я думаю, її тут немає), наприклад, оскільки тривалість опитування використовується в розрахунку, ви будете вказувати фактичну тривалість (а не просто використовувати час, прошений спати) . Це здається дуже багато; Я ніколи не профілював баш сценарії, тому не знаю, що було б тут нормально (хм ... добре окреме запитання). Викликати awk == fork()та подібні речі дорого; як було сказано, утиліти, написані всі на C, мали б швидші методи. Я все ще не думаю, що ти додаєш велике навантаження до загальної системи через тхо.
goldilocks

1
Ні, вибачте, я насправді мав на увазі: від моменту підключення навушників до наступного сну спостерігається деяка помітна затримка. Але я не планую скорочувати час сну. Спасибі за вашу допомогу!
Teresa e Junior

4

Якщо ви використовуєте PulseAudio, pactl subscribeце робить.


Так, справді! Я почав використовувати його після складання PA 4.0 кілька місяців тому через деякі проблеми зі звуком. Версія на Debian Stable становить 2.0 (хоча останнім часом вони завантажили 4,0 на спинки), а subscribeна версії 2,0 не було.
Teresa e Junior

2

Також майте на увазі, що деякі файли, які мають /proc/дозвіл відстежувати зміни за допомогою опитування, наприклад, якщо ви можете, man procви можете прочитати наступне про /proc/self/mountsфайл:

/ proc / [pid] / mounts (з Linux 2.4.19) У цьому файлі перераховані всі файлові системи, які зараз змонтовані у просторі імен монту процесу (див. простори mount_names (7)). Формат цього файлу задокументований у fstab (5).

Оскільки версія ядра 2.6.15, цей файл є полебеним: після відкриття файлу для читання зміна цього файлу (тобто, кріплення або відключення файлової системи) призводить до вибору (2) для позначення дескриптора файлу як надзвичайного стану та опитування (2) та epoll_wait (2) позначають файл як пріоритетну подію (POLLPRI). (До Linux 2.6.30 про зміну цього файлу було зазначено, що дескриптор файлу позначається як читабельний для вибору (2), і позначається як такий, що має умови помилки для опитування (2) та epoll_wait (2).)

І саме це реалізується в наступному питанні:

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


-1

Спробуйте використовувати netlinkдля моніторингу /procзмін файлів.

https://mdlayher.com/blog/linux-netlink-and-go-part-1-netlink/


Ласкаво просимо на сайт. Будь ласка , додайте деякі пояснення про те , як використовувати netlinkдля досягнення цього завдання; це не видно із зовнішнього контенту, який ви пов’язали. Крім того, загалом бажано не мати відповідей "лише для посилань", оскільки зовнішній вміст може змінюватися або видалятися (див. Повідомлення вгорі на вашій оригінально пов’язаній сторінці, наприклад), що зменшило б корисність вашого внеску.
AdminBee
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.