Messaggi del kernel del pipe in un altro process come si verificano

Ho un schermo OLED sul mio porttile che ho configurato per mostrare le informazioni sullo stato. Il driver corrente che ho installato in Linux è in grado di visualizzare i messaggi inviandoli in uno script come argomento separato da spazi.

Esempio: il command /opt/asusg50oled/utils/notify.sh Hi Everybody "Hello World" sullo schermo oled:

 Hi Everybody Hello World 

Se viene inviato un altro messaggio prima che i vecchi scompaiono e ritorni alle informazioni di stato, spenga il messaggio superiore. Esempio: less di 30 secondi dopo l'esempio precedente, /opt/asusg50oled/utils/notify.sh "Bananas have potassium" viene eseguito:

 Everybody Hello World Bananas have potassium 

Quello che voglio fare è avere i messaggi del kernel (il tipo che vedi eseguendo dmesg ) inoltrati a questo script. Ad esempio, quando inserisco un'unità USB, le seguenti informazioni verranno visualizzate sulla schermata OLED in fase di logging:

 [ 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 

Tieni presente che data la limitata width dello schermo, anche la scomparsa dei timestamp sarebbe utile. Quindi, alla fine della logging, lo schermo apparirà per circa 30 secondi:

      sdd: sdd1 sd 9:0:0:0: [sdd] Assuming drive cache: write through sd 9:0:0:0: [sdd] Attached SCSI removable disk 

    Quindi, per chiarire, voglio che i messaggi del kernel vengano inviati in diretta eseguendo /opt/asusg50oled/utils/notify.sh "$MESSAGE"

    Posso gettare filtri per eliminare qualsiasi cosa che non voglio vedere più tardi, voglio solo sapere come fare le parti sopra menzionate. Come posso fare questo?

    Modifica

    Come suggerisce Ciclamino, ho aggiunto la seguente row al mio file /etc/rsyslog.conf:

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

    Questo funzionava quasi, ma la formattazione ha portto l'OLED a mostrare la data, il nome host e la parola "kernel" prima di uscire dalla stanza. Dopo un po 'di scavo, ho capito quanto segue:

     $template OLEDformat,"%msg%0 kern.* ^/opt/asusg50oled/utils/notify.sh;OLEDformat 

    Questo è quasi lì, ma di nuovo, mi esaurisco di stanza a causa di una sorta di timestamp .. esempio esposizione:

     [ 4477.993774] sd 11:0:0:0: [sdb] At 

    Voglio sbarazzarmi dei numbers a braccia in modo da rimanere

     sd 11:0:0:0: [sdb] Attached SCSI rem 

    Ancora non è perfetta, ma il migliore che io riceverò con la dimensione dello schermo. Sarebbe ancora meglio se fosse diviso a 36 caratteri per poter avere qualcosa di simile:

     sd 11:0:0:0: [sdb] Attached SCSI rem ovable disk 

    RISOLTO

    Accetto la risposta di Ciclamino, perché mi ha portto where wherevo essere. Ecco cosa ho finito per fare:

    Ho creato e aggiunto il bit di esecuzione per shell script /opt/asusg50oled/utils/notify-kern.sh contenente

     #!/bin/bash cd `dirname $0` stringA=$1 stringB=${stringA#\[*\]} stringC=${stringB:0:36} stringD=${stringB:36} ./notify.sh "$stringC" "$stringD" 

    Poi ho aggiunto a /etc/rsyslog.conf

     ## output kernel messages to OLED $template OLEDformat,"%msg%" kern.* ^/opt/asusg50oled/utils/notify-kern.sh;OLEDformat 

    Infine, ho riavviato rsyslog con il sudo service rsyslog restart .

    È ansible utilizzare il syslog per catturare i messaggi del kernel e mandarli a un command. La syntax sarà un po 'diversa per le diverse implementazioni di syslogd. Ecco un esempio di come eseguirlo con rsyslog (in /etc/rsyslog.conf):

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

    ecco una soluzione veloce e sporca:

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

    È ansible ripetutamente leggere l'output di /proc/kmsg utilizzando la tail o qualunque metodo preferisci.

    Penso che wherete essere radici per farlo.