На моем ноутбуке есть 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
.