GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo agregar un mensaje que se leerá con dmesg?

Solución 1:

Puede, como root, escribir en /dev/kmsg para imprimir en el búfer de mensajes del kernel:

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

Probé esto en mi servidor y en un dispositivo Linux integrado, y funciona en ambos, así que supondré que funciona prácticamente en todas partes.

Solución 2:

dmesg muestra lo que hay en el búfer del kernel, mientras que logger es para syslogd . Creo que si desea imprimir cosas en el búfer del kernel, deberá crear un controlador que use el printk() función del núcleo. Si solo lo quieres en /var/log/messages , luego con una configuración "normal" creo que lo que has hecho con logger ya está bien.

El ejemplo más básico de un controlador con printk() sería:

hola.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

Entonces:

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

http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 para más...

Solución 3:

Basado en el módulo de Kyle anterior:


#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");

Para hacer una impresión desde el espacio del usuario:

echo "Hello" > /proc/printk

Solución 4:

La respuesta de @Calandoa ya no funciona para Kernel +3.10. Combiné su código y el código de ejemplo que encontré aquí. Luego mejoró la calidad del código...

Código guardado en 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);

Hacer usando este 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

Solución 5:

Basado en la respuesta de Kyle, aquí hay un tutorial rápido que muestra cómo hacer precisamente eso.


Linux
  1. Herramientas de Linux:enviar el mensaje con dmesg

  2. Cómo agregar un repositorio de Yum

  3. ¿Cómo ejecutar un comando que implique redirigir o canalizar con Sudo?

  4. ¿Cómo cambiar el nombre de los archivos específicamente en una lista que utilizará Wget?

  5. ¿Cómo leer un mensaje a la vez desde /var/mail?

Cómo crear o agregar un índice en MySQL con ejemplos

Cómo leer un archivo con espacios en Linux

Cómo agregar un nuevo usuario de MySQL con permisos GRANT

Cómo agregar dispositivos para monitorear con ManageEngine OpManager

¿Cómo agregar automáticamente una cuenta de usuario Y una contraseña con un script Bash?

¿Cómo contar líneas en un documento?