У мене на ноутбуці 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
.