How to add message that will be read with dmesg?Why is Syslog Not Writing Logs To The Designated Files?Linux...

Can you take a "free object interaction" while incapacitated?

Trouble reading roman numeral notation with flats

Why do Radio Buttons not fill the entire outer circle?

Could a welfare state co-exist with mega corporations?

Output visual diagram of picture

Air travel with refrigerated insulin

python displays `n` instead of breaking a line

Writing in a Christian voice

How to test the sharpness of a knife?

Pre-Employment Background Check With Consent For Future Checks

Did I make a mistake by ccing email to boss to others?

categorizing a variable turns it from insignificant to significant

Do native speakers use "ultima" and "proxima" frequently in spoken English?

Was Woodrow Wilson really a Liberal?

Why can't I get pgrep output right to variable on bash script?

When is the exact date for EOL of Ubuntu 14.04 LTS?

What is the tangent at a sharp point on a curve?

Highest stage count that are used one right after the other?

Is there a distance limit for minecart tracks?

A seasonal riddle

What properties make a magic weapon befit a Rogue more than a DEX-based Fighter?

What (if any) is the reason to buy in small local stores?

Strange behavior in TikZ draw command

Are hand made posters acceptable in Academia?



How to add message that will be read with dmesg?


Why is Syslog Not Writing Logs To The Designated Files?Linux Centos with dmesg timestampBusy Debian server (Xen guest) seems to go to sleep (energy saving mode)QEMU: Solaris 11 / Sparc64 Guest on Linux / X86-64 HostAppArmor - root: “You do not have enough privilege to read the profile set.”How to disable perf subsystem in Linux kernel?Poor performance with Linux software raid-10Running dmesg on Docker results in “dmesg: read kernel buffer failed: Permission denied”How to use wget with redirect and long URL?Prevent kernel messages from appearing in dmesg













42















I am trying to write some custom messages in my dmesg output. I tried:



logger "Hello"


but this does not work. It exits without error, but no "Hello" appears int the output of:



dmesg


I am using a Fedora 9, and it seems that there is no syslogd/klogd daemon running. However, all my kernel messages are succesfully written in the dmesg buffer.



Any idea?










share|improve this question



























    42















    I am trying to write some custom messages in my dmesg output. I tried:



    logger "Hello"


    but this does not work. It exits without error, but no "Hello" appears int the output of:



    dmesg


    I am using a Fedora 9, and it seems that there is no syslogd/klogd daemon running. However, all my kernel messages are succesfully written in the dmesg buffer.



    Any idea?










    share|improve this question

























      42












      42








      42


      14






      I am trying to write some custom messages in my dmesg output. I tried:



      logger "Hello"


      but this does not work. It exits without error, but no "Hello" appears int the output of:



      dmesg


      I am using a Fedora 9, and it seems that there is no syslogd/klogd daemon running. However, all my kernel messages are succesfully written in the dmesg buffer.



      Any idea?










      share|improve this question














      I am trying to write some custom messages in my dmesg output. I tried:



      logger "Hello"


      but this does not work. It exits without error, but no "Hello" appears int the output of:



      dmesg


      I am using a Fedora 9, and it seems that there is no syslogd/klogd daemon running. However, all my kernel messages are succesfully written in the dmesg buffer.



      Any idea?







      linux syslog dmesg






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked May 10 '10 at 18:24









      calandoacalandoa

      7002814




      7002814






















          6 Answers
          6






          active

          oldest

          votes


















          34














          dmesg displays what is in the kernel buffer, whereas logger is for syslogd. I think if you want to print things into the kernel buffer you will need to create a driver that uses the printk() kernel function. If you just want it in /var/log/messages, then with a "normal" setup I think what you have done with logger is already fine.



          The most basic example of a driver with printk() would be:



          hello.c:



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

          int init_module(void)
          {
          printk(KERN_INFO "Hello worldn");
          return 0;
          }

          void cleanup_module(void)
          {
          printk(KERN_INFO "Goodbye worldn");

          }


          Makefile:



          obj-m += hello.o

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


          Then:



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


          http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 for more...






          share|improve this answer


























          • I got an error, since you have put spaces before the make -C ... in the Makefile instead of a Tab, so copying the above contents of the Makefile does not work - more here. I appear to be unable to add this in an edit... Thanks by the way, great answer.

            – Wilf
            Jul 11 '14 at 18:17





















          104














          You can, as root, write to /dev/kmsg to print to the kernel message buffer:



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


          I've tested this on my server and an embedded Linux device, and it works on both, so I'm just going to assume it works pretty much everywhere.






          share|improve this answer



















          • 1





            Interesting that in Ubuntu, this works as root but not with sudo. One actually needs to become root.

            – dotancohen
            Jun 30 '12 at 8:53






          • 15





            Actually, that's because the input redirection is handled by your shell, which is not running with elevated rights. Try running echo Some message | sudo tee /dev/kmesg as non-root.

            – wvdschel
            Jul 4 '12 at 11:56








          • 3





            That works. Thanks, interesting. By the way, its kmsg not kmesg but I also confuse with dmesg which has the e!

            – dotancohen
            Jul 4 '12 at 14:55








          • 4





            Much easier than compiling kernel module

            – e271p314
            Mar 3 '14 at 9:22



















          13














          Based on Kyle's module above:




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


          To do a printk from user space:



          echo "Hello" > /proc/printk





          share|improve this answer



















          • 1





            This works for Linux kernel < 3.10 only. See my answer for a newer alternative.

            – kevinf
            Nov 25 '15 at 21:00



















          5














          @Calandoa's answer no longer works for Kernel +3.10. Combined his code, and the example code I found here. Then improved on the code quality...



          Code saved to 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] = '';
          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 using this 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





          share|improve this answer































            3














            Based off of Kyle's answer, here is a quick tutorial showing how to do just that.






            share|improve this answer































              0














              I just wanted some quick debugging messages in a daemon written by someone else in a cross complied kernel. I ran into a compile error trying to use printk, as <linux/module.h> could not be included. Rather then battle with that excessively (to do this the right way) I cheated and used the following lazy, but functional 5 minute workaround:



              void dmesg( const char *tag, const char *msg, const int len )
              {
              const int TAG_LEN=3;
              char buffer[128]={0};
              memcpy( &buffer[0], tag, TAG_LEN );
              memcpy( &buffer[TAG_LEN], msg, len );
              int fd_kmsg = open( "/dev/kmsg", O_WRONLY );
              write( fd_kmsg, &buffer, TAG_LEN+len );
              close( fd_kmsg );
              }
              void dmesgWarn( const char *msg, const int len ){ dmesg( "<4>", msg, len ); }
              void dmesgInfo( const char *msg, const int len ){ dmesg( "<6>", msg, len ); }
              void dmesgDebug( const char *msg, const int len ){ dmesg( "<7>", msg, len ); }





              share|improve this answer























                Your Answer








                StackExchange.ready(function() {
                var channelOptions = {
                tags: "".split(" "),
                id: "2"
                };
                initTagRenderer("".split(" "), "".split(" "), channelOptions);

                StackExchange.using("externalEditor", function() {
                // Have to fire editor after snippets, if snippets enabled
                if (StackExchange.settings.snippets.snippetsEnabled) {
                StackExchange.using("snippets", function() {
                createEditor();
                });
                }
                else {
                createEditor();
                }
                });

                function createEditor() {
                StackExchange.prepareEditor({
                heartbeatType: 'answer',
                autoActivateHeartbeat: false,
                convertImagesToLinks: true,
                noModals: true,
                showLowRepImageUploadWarning: true,
                reputationToPostImages: 10,
                bindNavPrevention: true,
                postfix: "",
                imageUploader: {
                brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                allowUrls: true
                },
                onDemand: true,
                discardSelector: ".discard-answer"
                ,immediatelyShowMarkdownHelp:true
                });


                }
                });














                draft saved

                draft discarded


















                StackExchange.ready(
                function () {
                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fserverfault.com%2fquestions%2f140354%2fhow-to-add-message-that-will-be-read-with-dmesg%23new-answer', 'question_page');
                }
                );

                Post as a guest















                Required, but never shown

























                6 Answers
                6






                active

                oldest

                votes








                6 Answers
                6






                active

                oldest

                votes









                active

                oldest

                votes






                active

                oldest

                votes









                34














                dmesg displays what is in the kernel buffer, whereas logger is for syslogd. I think if you want to print things into the kernel buffer you will need to create a driver that uses the printk() kernel function. If you just want it in /var/log/messages, then with a "normal" setup I think what you have done with logger is already fine.



                The most basic example of a driver with printk() would be:



                hello.c:



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

                int init_module(void)
                {
                printk(KERN_INFO "Hello worldn");
                return 0;
                }

                void cleanup_module(void)
                {
                printk(KERN_INFO "Goodbye worldn");

                }


                Makefile:



                obj-m += hello.o

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


                Then:



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


                http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 for more...






                share|improve this answer


























                • I got an error, since you have put spaces before the make -C ... in the Makefile instead of a Tab, so copying the above contents of the Makefile does not work - more here. I appear to be unable to add this in an edit... Thanks by the way, great answer.

                  – Wilf
                  Jul 11 '14 at 18:17


















                34














                dmesg displays what is in the kernel buffer, whereas logger is for syslogd. I think if you want to print things into the kernel buffer you will need to create a driver that uses the printk() kernel function. If you just want it in /var/log/messages, then with a "normal" setup I think what you have done with logger is already fine.



                The most basic example of a driver with printk() would be:



                hello.c:



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

                int init_module(void)
                {
                printk(KERN_INFO "Hello worldn");
                return 0;
                }

                void cleanup_module(void)
                {
                printk(KERN_INFO "Goodbye worldn");

                }


                Makefile:



                obj-m += hello.o

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


                Then:



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


                http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 for more...






                share|improve this answer


























                • I got an error, since you have put spaces before the make -C ... in the Makefile instead of a Tab, so copying the above contents of the Makefile does not work - more here. I appear to be unable to add this in an edit... Thanks by the way, great answer.

                  – Wilf
                  Jul 11 '14 at 18:17
















                34












                34








                34







                dmesg displays what is in the kernel buffer, whereas logger is for syslogd. I think if you want to print things into the kernel buffer you will need to create a driver that uses the printk() kernel function. If you just want it in /var/log/messages, then with a "normal" setup I think what you have done with logger is already fine.



                The most basic example of a driver with printk() would be:



                hello.c:



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

                int init_module(void)
                {
                printk(KERN_INFO "Hello worldn");
                return 0;
                }

                void cleanup_module(void)
                {
                printk(KERN_INFO "Goodbye worldn");

                }


                Makefile:



                obj-m += hello.o

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


                Then:



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


                http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 for more...






                share|improve this answer















                dmesg displays what is in the kernel buffer, whereas logger is for syslogd. I think if you want to print things into the kernel buffer you will need to create a driver that uses the printk() kernel function. If you just want it in /var/log/messages, then with a "normal" setup I think what you have done with logger is already fine.



                The most basic example of a driver with printk() would be:



                hello.c:



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

                int init_module(void)
                {
                printk(KERN_INFO "Hello worldn");
                return 0;
                }

                void cleanup_module(void)
                {
                printk(KERN_INFO "Goodbye worldn");

                }


                Makefile:



                obj-m += hello.o

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


                Then:



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


                http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN121 for more...







                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited May 4 '15 at 20:01









                kasperd

                26.7k1251104




                26.7k1251104










                answered May 10 '10 at 18:30









                Kyle BrandtKyle Brandt

                66.2k61263412




                66.2k61263412













                • I got an error, since you have put spaces before the make -C ... in the Makefile instead of a Tab, so copying the above contents of the Makefile does not work - more here. I appear to be unable to add this in an edit... Thanks by the way, great answer.

                  – Wilf
                  Jul 11 '14 at 18:17





















                • I got an error, since you have put spaces before the make -C ... in the Makefile instead of a Tab, so copying the above contents of the Makefile does not work - more here. I appear to be unable to add this in an edit... Thanks by the way, great answer.

                  – Wilf
                  Jul 11 '14 at 18:17



















                I got an error, since you have put spaces before the make -C ... in the Makefile instead of a Tab, so copying the above contents of the Makefile does not work - more here. I appear to be unable to add this in an edit... Thanks by the way, great answer.

                – Wilf
                Jul 11 '14 at 18:17







                I got an error, since you have put spaces before the make -C ... in the Makefile instead of a Tab, so copying the above contents of the Makefile does not work - more here. I appear to be unable to add this in an edit... Thanks by the way, great answer.

                – Wilf
                Jul 11 '14 at 18:17















                104














                You can, as root, write to /dev/kmsg to print to the kernel message buffer:



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


                I've tested this on my server and an embedded Linux device, and it works on both, so I'm just going to assume it works pretty much everywhere.






                share|improve this answer



















                • 1





                  Interesting that in Ubuntu, this works as root but not with sudo. One actually needs to become root.

                  – dotancohen
                  Jun 30 '12 at 8:53






                • 15





                  Actually, that's because the input redirection is handled by your shell, which is not running with elevated rights. Try running echo Some message | sudo tee /dev/kmesg as non-root.

                  – wvdschel
                  Jul 4 '12 at 11:56








                • 3





                  That works. Thanks, interesting. By the way, its kmsg not kmesg but I also confuse with dmesg which has the e!

                  – dotancohen
                  Jul 4 '12 at 14:55








                • 4





                  Much easier than compiling kernel module

                  – e271p314
                  Mar 3 '14 at 9:22
















                104














                You can, as root, write to /dev/kmsg to print to the kernel message buffer:



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


                I've tested this on my server and an embedded Linux device, and it works on both, so I'm just going to assume it works pretty much everywhere.






                share|improve this answer



















                • 1





                  Interesting that in Ubuntu, this works as root but not with sudo. One actually needs to become root.

                  – dotancohen
                  Jun 30 '12 at 8:53






                • 15





                  Actually, that's because the input redirection is handled by your shell, which is not running with elevated rights. Try running echo Some message | sudo tee /dev/kmesg as non-root.

                  – wvdschel
                  Jul 4 '12 at 11:56








                • 3





                  That works. Thanks, interesting. By the way, its kmsg not kmesg but I also confuse with dmesg which has the e!

                  – dotancohen
                  Jul 4 '12 at 14:55








                • 4





                  Much easier than compiling kernel module

                  – e271p314
                  Mar 3 '14 at 9:22














                104












                104








                104







                You can, as root, write to /dev/kmsg to print to the kernel message buffer:



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


                I've tested this on my server and an embedded Linux device, and it works on both, so I'm just going to assume it works pretty much everywhere.






                share|improve this answer













                You can, as root, write to /dev/kmsg to print to the kernel message buffer:



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


                I've tested this on my server and an embedded Linux device, and it works on both, so I'm just going to assume it works pretty much everywhere.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Feb 23 '12 at 14:47









                wvdschelwvdschel

                1,141273




                1,141273








                • 1





                  Interesting that in Ubuntu, this works as root but not with sudo. One actually needs to become root.

                  – dotancohen
                  Jun 30 '12 at 8:53






                • 15





                  Actually, that's because the input redirection is handled by your shell, which is not running with elevated rights. Try running echo Some message | sudo tee /dev/kmesg as non-root.

                  – wvdschel
                  Jul 4 '12 at 11:56








                • 3





                  That works. Thanks, interesting. By the way, its kmsg not kmesg but I also confuse with dmesg which has the e!

                  – dotancohen
                  Jul 4 '12 at 14:55








                • 4





                  Much easier than compiling kernel module

                  – e271p314
                  Mar 3 '14 at 9:22














                • 1





                  Interesting that in Ubuntu, this works as root but not with sudo. One actually needs to become root.

                  – dotancohen
                  Jun 30 '12 at 8:53






                • 15





                  Actually, that's because the input redirection is handled by your shell, which is not running with elevated rights. Try running echo Some message | sudo tee /dev/kmesg as non-root.

                  – wvdschel
                  Jul 4 '12 at 11:56








                • 3





                  That works. Thanks, interesting. By the way, its kmsg not kmesg but I also confuse with dmesg which has the e!

                  – dotancohen
                  Jul 4 '12 at 14:55








                • 4





                  Much easier than compiling kernel module

                  – e271p314
                  Mar 3 '14 at 9:22








                1




                1





                Interesting that in Ubuntu, this works as root but not with sudo. One actually needs to become root.

                – dotancohen
                Jun 30 '12 at 8:53





                Interesting that in Ubuntu, this works as root but not with sudo. One actually needs to become root.

                – dotancohen
                Jun 30 '12 at 8:53




                15




                15





                Actually, that's because the input redirection is handled by your shell, which is not running with elevated rights. Try running echo Some message | sudo tee /dev/kmesg as non-root.

                – wvdschel
                Jul 4 '12 at 11:56







                Actually, that's because the input redirection is handled by your shell, which is not running with elevated rights. Try running echo Some message | sudo tee /dev/kmesg as non-root.

                – wvdschel
                Jul 4 '12 at 11:56






                3




                3





                That works. Thanks, interesting. By the way, its kmsg not kmesg but I also confuse with dmesg which has the e!

                – dotancohen
                Jul 4 '12 at 14:55







                That works. Thanks, interesting. By the way, its kmsg not kmesg but I also confuse with dmesg which has the e!

                – dotancohen
                Jul 4 '12 at 14:55






                4




                4





                Much easier than compiling kernel module

                – e271p314
                Mar 3 '14 at 9:22





                Much easier than compiling kernel module

                – e271p314
                Mar 3 '14 at 9:22











                13














                Based on Kyle's module above:




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


                To do a printk from user space:



                echo "Hello" > /proc/printk





                share|improve this answer



















                • 1





                  This works for Linux kernel < 3.10 only. See my answer for a newer alternative.

                  – kevinf
                  Nov 25 '15 at 21:00
















                13














                Based on Kyle's module above:




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


                To do a printk from user space:



                echo "Hello" > /proc/printk





                share|improve this answer



















                • 1





                  This works for Linux kernel < 3.10 only. See my answer for a newer alternative.

                  – kevinf
                  Nov 25 '15 at 21:00














                13












                13








                13







                Based on Kyle's module above:




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


                To do a printk from user space:



                echo "Hello" > /proc/printk





                share|improve this answer













                Based on Kyle's module above:




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


                To do a printk from user space:



                echo "Hello" > /proc/printk






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered May 11 '10 at 9:34









                calandoacalandoa

                7002814




                7002814








                • 1





                  This works for Linux kernel < 3.10 only. See my answer for a newer alternative.

                  – kevinf
                  Nov 25 '15 at 21:00














                • 1





                  This works for Linux kernel < 3.10 only. See my answer for a newer alternative.

                  – kevinf
                  Nov 25 '15 at 21:00








                1




                1





                This works for Linux kernel < 3.10 only. See my answer for a newer alternative.

                – kevinf
                Nov 25 '15 at 21:00





                This works for Linux kernel < 3.10 only. See my answer for a newer alternative.

                – kevinf
                Nov 25 '15 at 21:00











                5














                @Calandoa's answer no longer works for Kernel +3.10. Combined his code, and the example code I found here. Then improved on the code quality...



                Code saved to 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] = '';
                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 using this 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





                share|improve this answer




























                  5














                  @Calandoa's answer no longer works for Kernel +3.10. Combined his code, and the example code I found here. Then improved on the code quality...



                  Code saved to 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] = '';
                  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 using this 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





                  share|improve this answer


























                    5












                    5








                    5







                    @Calandoa's answer no longer works for Kernel +3.10. Combined his code, and the example code I found here. Then improved on the code quality...



                    Code saved to 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] = '';
                    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 using this 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





                    share|improve this answer













                    @Calandoa's answer no longer works for Kernel +3.10. Combined his code, and the example code I found here. Then improved on the code quality...



                    Code saved to 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] = '';
                    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 using this 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






                    share|improve this answer












                    share|improve this answer



                    share|improve this answer










                    answered Nov 25 '15 at 20:59









                    kevinfkevinf

                    17116




                    17116























                        3














                        Based off of Kyle's answer, here is a quick tutorial showing how to do just that.






                        share|improve this answer




























                          3














                          Based off of Kyle's answer, here is a quick tutorial showing how to do just that.






                          share|improve this answer


























                            3












                            3








                            3







                            Based off of Kyle's answer, here is a quick tutorial showing how to do just that.






                            share|improve this answer













                            Based off of Kyle's answer, here is a quick tutorial showing how to do just that.







                            share|improve this answer












                            share|improve this answer



                            share|improve this answer










                            answered May 10 '10 at 18:35









                            TCampbellTCampbell

                            1,8941212




                            1,8941212























                                0














                                I just wanted some quick debugging messages in a daemon written by someone else in a cross complied kernel. I ran into a compile error trying to use printk, as <linux/module.h> could not be included. Rather then battle with that excessively (to do this the right way) I cheated and used the following lazy, but functional 5 minute workaround:



                                void dmesg( const char *tag, const char *msg, const int len )
                                {
                                const int TAG_LEN=3;
                                char buffer[128]={0};
                                memcpy( &buffer[0], tag, TAG_LEN );
                                memcpy( &buffer[TAG_LEN], msg, len );
                                int fd_kmsg = open( "/dev/kmsg", O_WRONLY );
                                write( fd_kmsg, &buffer, TAG_LEN+len );
                                close( fd_kmsg );
                                }
                                void dmesgWarn( const char *msg, const int len ){ dmesg( "<4>", msg, len ); }
                                void dmesgInfo( const char *msg, const int len ){ dmesg( "<6>", msg, len ); }
                                void dmesgDebug( const char *msg, const int len ){ dmesg( "<7>", msg, len ); }





                                share|improve this answer




























                                  0














                                  I just wanted some quick debugging messages in a daemon written by someone else in a cross complied kernel. I ran into a compile error trying to use printk, as <linux/module.h> could not be included. Rather then battle with that excessively (to do this the right way) I cheated and used the following lazy, but functional 5 minute workaround:



                                  void dmesg( const char *tag, const char *msg, const int len )
                                  {
                                  const int TAG_LEN=3;
                                  char buffer[128]={0};
                                  memcpy( &buffer[0], tag, TAG_LEN );
                                  memcpy( &buffer[TAG_LEN], msg, len );
                                  int fd_kmsg = open( "/dev/kmsg", O_WRONLY );
                                  write( fd_kmsg, &buffer, TAG_LEN+len );
                                  close( fd_kmsg );
                                  }
                                  void dmesgWarn( const char *msg, const int len ){ dmesg( "<4>", msg, len ); }
                                  void dmesgInfo( const char *msg, const int len ){ dmesg( "<6>", msg, len ); }
                                  void dmesgDebug( const char *msg, const int len ){ dmesg( "<7>", msg, len ); }





                                  share|improve this answer


























                                    0












                                    0








                                    0







                                    I just wanted some quick debugging messages in a daemon written by someone else in a cross complied kernel. I ran into a compile error trying to use printk, as <linux/module.h> could not be included. Rather then battle with that excessively (to do this the right way) I cheated and used the following lazy, but functional 5 minute workaround:



                                    void dmesg( const char *tag, const char *msg, const int len )
                                    {
                                    const int TAG_LEN=3;
                                    char buffer[128]={0};
                                    memcpy( &buffer[0], tag, TAG_LEN );
                                    memcpy( &buffer[TAG_LEN], msg, len );
                                    int fd_kmsg = open( "/dev/kmsg", O_WRONLY );
                                    write( fd_kmsg, &buffer, TAG_LEN+len );
                                    close( fd_kmsg );
                                    }
                                    void dmesgWarn( const char *msg, const int len ){ dmesg( "<4>", msg, len ); }
                                    void dmesgInfo( const char *msg, const int len ){ dmesg( "<6>", msg, len ); }
                                    void dmesgDebug( const char *msg, const int len ){ dmesg( "<7>", msg, len ); }





                                    share|improve this answer













                                    I just wanted some quick debugging messages in a daemon written by someone else in a cross complied kernel. I ran into a compile error trying to use printk, as <linux/module.h> could not be included. Rather then battle with that excessively (to do this the right way) I cheated and used the following lazy, but functional 5 minute workaround:



                                    void dmesg( const char *tag, const char *msg, const int len )
                                    {
                                    const int TAG_LEN=3;
                                    char buffer[128]={0};
                                    memcpy( &buffer[0], tag, TAG_LEN );
                                    memcpy( &buffer[TAG_LEN], msg, len );
                                    int fd_kmsg = open( "/dev/kmsg", O_WRONLY );
                                    write( fd_kmsg, &buffer, TAG_LEN+len );
                                    close( fd_kmsg );
                                    }
                                    void dmesgWarn( const char *msg, const int len ){ dmesg( "<4>", msg, len ); }
                                    void dmesgInfo( const char *msg, const int len ){ dmesg( "<6>", msg, len ); }
                                    void dmesgDebug( const char *msg, const int len ){ dmesg( "<7>", msg, len ); }






                                    share|improve this answer












                                    share|improve this answer



                                    share|improve this answer










                                    answered 16 mins ago









                                    BuvinJBuvinJ

                                    20918




                                    20918






























                                        draft saved

                                        draft discarded




















































                                        Thanks for contributing an answer to Server Fault!


                                        • Please be sure to answer the question. Provide details and share your research!

                                        But avoid



                                        • Asking for help, clarification, or responding to other answers.

                                        • Making statements based on opinion; back them up with references or personal experience.


                                        To learn more, see our tips on writing great answers.




                                        draft saved


                                        draft discarded














                                        StackExchange.ready(
                                        function () {
                                        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fserverfault.com%2fquestions%2f140354%2fhow-to-add-message-that-will-be-read-with-dmesg%23new-answer', 'question_page');
                                        }
                                        );

                                        Post as a guest















                                        Required, but never shown





















































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown

































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown







                                        Popular posts from this blog

                                        117736 Шеррод Примітки | Див. також | Посилання | Навігаційне...

                                        As a Security Precaution, the user account has been locked The Next CEO of Stack OverflowMS...

                                        Маріан Котлеба Зміст Життєпис | Політичні погляди |...