68

I'd like to write a statement to dmesg. How can I do this?

4
  • 11
    Two reasons I've wanted to do this before: (1) to see what "now is" in dmesg-timestamp format, and (2) to know when I last looked at dmesg.
    – notlesh
    Apr 3, 2012 at 20:39
  • 1
    I'm pretty sure now is seconds from boot, and I think it takes a kernel call to write to it so a userland program can't.
    – Kevin
    Apr 3, 2012 at 21:22
  • 3
    @Kevin, so you know without looking how many seconds have elapsed since you booted?
    – notlesh
    Apr 4, 2012 at 1:28
  • @Kevin it's the number of microseconds since boot, just formatted as seconds to make it easier to read for us humans.
    – Matthieu
    Aug 2, 2018 at 12:10

6 Answers 6

60

Write to /dev/kmsg (not /proc/kmsg as suggested by @Nils). See linux/kernel/printk/printk.c devkmsg_writev for the kernel-side implementation and systemd/src/journal/journald-kmsg.c server_forward_kmsg for an example of usage.

2
  • It's not allowed on some system for non-root users (e.g.: Android kernel) :-(.
    – pevik
    Jan 7, 2016 at 11:20
  • 21
    E.g. date | sudo tee /dev/kmsg
    – sanmai
    Apr 11, 2016 at 3:46
19

For BSDs:

logger -p kern.notice MESSAGE

(courtesy Ian, freebsd-questions mailing list)

or other priorities.

For Linux:

su root -c 'echo MESSAGE > /dev/kmsg'
1

Assuming nobody else comes up with an official way to do this ...

You can write a kernel module that calls the printk function. There's an example here that might just do the job for you.

1
  • 10
    a. No need, others have written it already (e.g. kecho). b. Really no need for an extra module, see my answer.
    – ephemient
    Apr 3, 2012 at 21:44
1

--> You may write a C program as below:

test_mod.c

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

int init_module(void)
{
    printk("Hello All\n This is a test init\n");
    return 0;
}

void cleanup_module(void)
{
    printk("Good Bye");
}

--> make object file:

echo "obj-m := test_mod.o" > Makefile

--> compile by running :

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

--> load your module as below:

insmod ./test_mod.ko

see the output:

dmesg | tail

--> unload module:

rmmod test_mod.ko
-1
echo "Add your message here" | sudo tee /dev/kmsg

Verify by running dmesg -T

1
-2

If I understood man dmesg correctly, you should be able to write to /proc/kmsg.

1
  • 4
    # echo "test" >> /proc/kmsg [yields =>] -su: echo: write error: Input/output error
    – notlesh
    Apr 3, 2012 at 20:50

Not the answer you're looking for? Browse other questions tagged or ask your own question.