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


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.