Ядро канала обменивается сообщениями к другому процессу, как они происходят

У меня есть экран 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) переданный этому сценарию. Например, когда я вставляю Карту памяти, следующая информация показала бы на экране 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"

Я могу добавить фильтры для избавлений от чего-либо, что я не хочу видеть позже, я просто хочу знать, как внести свой вклад упомянутый выше. Как я могу сделать это?

Править

Как предложенный Цицламино, я добавил следующую строку к своему/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

РЕШЕННЫЙ

Я принимаю ответ Ciclamino, поскольку это получило меня туда, где я должен был быть. Вот то, что я закончил тем, что делал:

Я создал и добавил, выполняют бит к сценарию оболочки /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.

4
задан 14.04.2011, 21:46

3 ответа

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

kern.*  ^/opt/asusg50oled/utils/notify.sh
3
ответ дан 07.12.2019, 20:08

вот быстрое и грязное решение:

tail -n 0 -f /var/log/messages | while read -r MESSAGE; do
  /opt/asusg50oled/utils/notify.sh "$MESSAGE"
done
3
ответ дан 07.12.2019, 20:08

Можно неоднократно читать вывод /proc/kmsg использование tail или безотносительно метода Вы предпочитаете.

Я думаю, что необходимо быть корнем, чтобы сделать так, как бы то ни было.

0
ответ дан 07.12.2019, 20:08

Теги

Похожие вопросы