Повідомлення ядра в інший процес у міру їх виникнення


4

У мене на ноутбуці OLED-екран, який я налаштував на показ інформації про стан. Поточний драйвер, який я встановив у Linux, він може відображати повідомлення, надсилаючи їх до сценарію, як аргумент, розділений пробілами.

Приклад: команда /opt/asusg50oled/utils/notify.sh Hi Everybody "Hello World"відображається на oled екрані:

Hi
Everybody
Hello World

Якщо інше повідомлення надсилається перед тим, як старі зникають, і воно повертається до інформації про стан, воно відсуває верхнє повідомлення. Приклад: менше ніж 30 секунд після попереднього прикладу /opt/asusg50oled/utils/notify.sh "Bananas have potassium"виконується:

Everybody
Hello World
Bananas have potassium

Що я хочу зробити, - це повідомлення ядра (типу, яке ви бачите при запуску dmesg), перенаправлені до цього сценарію. Наприклад, коли я вставляю USB-накопичувач, на OLED-екрані відображатиметься така інформація під час їх входу:

[ 1283.200150] usb 2-4: new high speed USB device using ehci_hcd and address 4
[ 1283.353322] scsi9 : usb-storage 2-4:1.0
[ 1284.351366] scsi 9:0:0:0: Direct-Access     SanDisk  Cruzer           1.03 PQ: 0 ANSI: 2
[ 1284.352697] sd 9:0:0:0: Attached scsi generic sg4 type 0
[ 1284.355669] sd 9:0:0:0: [sdd] 31266816 512-byte logical blocks: (16.0 GB/14.9 GiB)
[ 1284.357032] sd 9:0:0:0: [sdd] Write Protect is off
[ 1284.357041] sd 9:0:0:0: [sdd] Mode Sense: 03 00 00 00
[ 1284.357047] sd 9:0:0:0: [sdd] Assuming drive cache: write through
[ 1284.364356] sd 9:0:0:0: [sdd] Assuming drive cache: write through
[ 1284.364371]  sdd: sdd1
[ 1284.371656] sd 9:0:0:0: [sdd] Assuming drive cache: write through
[ 1284.371666] sd 9:0:0:0: [sdd] Attached SCSI removable disk

Зауважте, що, враховуючи обмежену ширину екрана, також було б корисно знімати часові позначки. Отже, наприкінці журналу на екрані відображатиметься приблизно 30 секунд:

  sdd: sdd1
 sd 9:0:0:0: [sdd] Assuming drive cache: write through
 sd 9:0:0:0: [sdd] Attached SCSI removable disk

Отже, для уточнення, я хочу, щоб повідомлення ядра надсилалися в реальному часі виконанням /opt/asusg50oled/utils/notify.sh "$MESSAGE"

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

Редагувати

Як запропонував Ciclamino, я додав наступний рядок у файл /etc/rsyslog.conf:

kern.*  ^/opt/asusg50oled/utils/notify.sh

Це майже спрацювало, але форматування призвело до того, що OLED просто показував дату, ім'я хоста та слово 'ядро', перш ніж вибігати з кімнати. Трохи копавшись, я з’ясував таке:

$template OLEDformat,"%msg%0
kern.*  ^/opt/asusg50oled/utils/notify.sh;OLEDformat

Цього майже немає, але знову ж таки, у мене не вистачає кімнати через якусь часову позначку .. приклад відображення:

[ 4477.993774] sd 11:0:0:0: [sdb] At

Я хочу позбутися від закреслених цифр, щоб я залишився

sd 11:0:0:0: [sdb] Attached SCSI rem

Все ще не ідеально, але найкраще, що я отримаю з розміром екрана. Було б навіть краще, якби він розділив його на 36 символів, щоб у мене вийшло щось на зразок наступного:

sd 11:0:0:0: [sdb] Attached SCSI rem
ovable disk

РЕШЕНО

Я приймаю відповідь Цикламіно, тому що вона перевела мене туди, де я мав бути. Ось що я закінчив робити:

Я створив і додав біт виконання до сценарію оболонки, /opt/asusg50oled/utils/notify-kern.shщо містить

#!/bin/bash
cd `dirname $0`
stringA=$1
stringB=${stringA#\[*\]}
stringC=${stringB:0:36}
stringD=${stringB:36}
./notify.sh "$stringC" "$stringD"

Потім я додав /etc/rsyslog.conf

## output kernel messages to OLED
$template OLEDformat,"%msg%"
kern.*  ^/opt/asusg50oled/utils/notify-kern.sh;OLEDformat

Нарешті я перезапустив rsyslog sudo service rsyslog restart.

Відповіді:


3

Ви можете використовувати syslog для лову ядерних повідомлень і передачі їх команді. Синтаксис буде дещо іншим для різних різних реалізацій syslogd. Ось приклад того, як це зробити з rsyslog (у /etc/rsyslog.conf):

kern.*  ^/opt/asusg50oled/utils/notify.sh

Це схоже саме на те, що я хочу зробити. Я перевіряю, чи працює він наступного разу, коли я перебуваю в Linux.
— TuxRug

Це ДУЖЕ близько ... Зараз я отримую дату, ім'я хоста, слово ядро, двокрапку, а потім у OLED не вистачає місця ... Я перегляну, чи зможу я зрозуміти, як відголити це ... Я впевнений, що можу написати проміжний сценарій, щоб витягнути: і все до цього.
— TuxRug

Схоже, мені потрібна трохи більше допомоги ... як змусити її збрити все, аж до першого ":"? Зараз я отримую, Apr 14 11:36:35 TuxTop-III-LM kernel:і тоді мені не вистачає місця.
— TuxRug

Гаразд, я знайшов щось, що мене ще більше зблизило ... Я використовував шаблон (див. Правки до питання). Досі не зовсім там.
— TuxRug

3

ось швидке та брудне рішення:

tail -n 0 -f /var/log/messages | while read -r MESSAGE; do
  /opt/asusg50oled/utils/notify.sh "$MESSAGE"
done

Це, однак, не підштовхує їх, як вони трапляються, і я хочу лише відображати ті, що тільки що вистрілили. Я хочу, щоб щось схоплювало повідомлення в міру їх отримання.
— TuxRug

1
@TuxRug я заплутався. Це мало бути /var/log/messagesзамість /var/log/dmesg. Я оновив свою відповідь. Крім того, tail -n 0ви отримуєте новіші повідомлення лише після виклику команди.
— lesmana

0

Ви можете неодноразово читати результати /proc/kmsgвикористання tailабо будь-якого іншого способу.

Я думаю, що для цього потрібно мати корінь.


На жаль, це буде нескінченно друкувати повідомлення знову і знову. Я хочу, щоб команда була запущена один раз на повідомлення, щоб повідомлення з’являлося протягом 30 секунд. Як тільки 30 секунд пройде без нового повідомлення, воно повернеться до нормального відображення статусу.
— TuxRug
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.