GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie füge ich eine Nachricht hinzu, die mit dmesg gelesen wird?

Lösung 1:

Sie können als root in /dev/kmsg schreiben um in den Nachrichtenpuffer des Kernels zu drucken:

 fixnum:~# echo Some message > /dev/kmsg
 fixnum:~# dmesg | tail -n1
 [28078118.692242] Some message

Ich habe dies auf meinem Server und einem eingebetteten Linux-Gerät getestet und es funktioniert auf beiden, also gehe ich einfach davon aus, dass es so ziemlich überall funktioniert.

Lösung 2:

dmesg zeigt an, was sich im Kernel-Puffer befindet, während logger ist für syslogd . Ich denke, wenn Sie Dinge in den Kernelpuffer drucken möchten, müssen Sie einen Treiber erstellen, der den printk() verwendet Kernel-Funktion. Wenn Sie es nur in /var/log/messages wollen , dann mit einem "normalen" Setup denke ich, was Sie mit logger gemacht haben ist schon in Ordnung.

Das einfachste Beispiel eines Treibers mit printk() wäre:

hallo.c:

#include <linux/module.h>
#include <linux/kernel.h>

int init_module(void)
{
    printk(KERN_INFO "Hello world\n");
    return 0;
}

void cleanup_module(void)
{
    printk(KERN_INFO "Goodbye world\n");

}

Makefile:

obj-m += hello.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

Dann:

$ make
$ sudo insmod hello.ko
$ dmesg | tail -n1
 [7089996.746366] Hello world

http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 für mehr...

Lösung 3:

Basierend auf Kyles Modul oben:


#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>

static int pk_write(struct file *file, const char *buffer, unsigned long count, void *data)
{
        char string[256];
        count = count < 255 ? count : 255;

        if(copy_from_user(string, buffer, count))
                return -EFAULT;

        string[count] = '\0';        
        printk(string);
        return count;
}


static int __init printk_init(void)
{
        struct proc_dir_entry *pk_file;

        pk_file = create_proc_entry("printk", 0222, NULL);
        if(pk_file == NULL)
                return -ENOMEM;

        pk_file->write_proc = pk_write;
        pk_file->owner = THIS_MODULE;

        return 0;
}

static void __exit printk_cleanup(void)
{
        remove_proc_entry("printk", NULL);
}

module_init(printk_init);
module_exit(printk_cleanup);
MODULE_LICENSE("GPL");

So führen Sie einen Druck aus dem Benutzerbereich aus:

echo "Hello" > /proc/printk

Lösung 4:

Die Antwort von @Calandoa funktioniert nicht mehr für Kernel +3.10. Kombiniert seinen Code und den Beispielcode, den ich hier gefunden habe. Dann verbesserte sich die Codequalität...

Code gespeichert in printk_user.c

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>

static ssize_t write_proc(struct file *filep, const char *buffer, size_t count, loff_t *offsetp)
{
    char string[256];
    count = count < 255 ? count : 255;

    if(copy_from_user(string, buffer, count) != 0) {
        return -EFAULT;
    }

    string[count] = '\0';
    printk(string);
    return count;
}

static const struct file_operations proc_fops = {
    .owner = THIS_MODULE,
    .write = write_proc,
};

static int proc_init(void) {
    struct proc_dir_entry *proc_file;
    proc_file = proc_create("printk_user", 0, NULL, &proc_fops);

    if(proc_file == NULL) {
        return -ENOMEM;
    }

    return 0;
}

static void proc_cleanup(void) {
    remove_proc_entry("printk_user", NULL);
}

MODULE_LICENSE("GPL"); 
module_init(proc_init);
module_exit(proc_cleanup);

Make mit diesem Makefile

TARGET = printk_user
obj-m := $(TARGET).o

KERNEL_VERSION=$(shell uname -r)
KDIR = /lib/modules/$(KERNEL_VERSION)/build
PWD = $(shell pwd)

printk:
    $(MAKE) -C $(KDIR) M=$(PWD) modules

clean:
    $(MAKE) -C $(KDIR) M=$(PWD) clean

Lösung 5:

Basierend auf Kyles Antwort ist hier ein kurzes Tutorial, das zeigt, wie man genau das macht.


Linux
  1. Benutzer zu Gruppe in Linux hinzufügen, Anleitung (mit Beispielen)

  2. Linux-Tools:Mit dmesg die Nachricht rausholen

  3. So fügen Sie ein Yum-Repository hinzu

  4. So fügen Sie Shebang # hinzu! mit PHP-Skript unter Linux?

  5. Wie drucke ich eine Nachricht an stderr in Go?

So erstellen oder fügen Sie einen Index in MySQL mit Beispielen hinzu

So lesen Sie eine Datei mit Leerzeichen in Linux

So fügen Sie einen neuen MySQL-Benutzer mit GRANT-Berechtigungen hinzu

Wie kann man eine Datei ausgeben und Zeilen ignorieren, die mit „?“ beginnen?

Wie sortiere ich mit einem Trennzeichen, das mehrere Zeichen lang ist?

So fügen Sie mit ManageEngine OpManager zu überwachende Geräte hinzu