75

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

4
  • 12
    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
    Commented 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
    Commented Apr 3, 2012 at 21:22
  • 3
    @Kevin, so you know without looking how many seconds have elapsed since you booted?
    – notlesh
    Commented 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
    Commented Aug 2, 2018 at 12:10

6 Answers 6

74

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.

4
  • It's not allowed on some system for non-root users (e.g.: Android kernel) :-(.
    – pevik
    Commented Jan 7, 2016 at 11:20
  • 28
    E.g. date | sudo tee /dev/kmsg
    – sanmai
    Commented Apr 11, 2016 at 3:46
  • Worth noting, that while this will make the message appear in dmesg, however over a netconsole debugging utility (where you'd expect to see the same content) you will not see the message until you increase dmesg debugging level. For example sudo dmesg -n 8 works.
    – Hi-Angel
    Commented Mar 26, 2023 at 21:37
  • As a n00b, I was pleasantly surprised that you have only to put a colon in your message if you want dmesg to highlight the prefix: echo "BLAH: This is your message!" | sudo tee /dev/kmsg.
    – AbuNassar
    Commented Jun 29, 2023 at 17:55
21

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
    Commented 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
  • 3
    This might have been better as an edit to the accepted answer, which already suggests writing to /dev/kmsg.
    – Kusalananda
    Commented Jun 13, 2022 at 11:27
-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
    Commented Apr 3, 2012 at 20:50

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .