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 ответа3

3

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

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

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

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

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

Однако я думаю, что для этого вам нужно быть пользователем root.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .