]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
dmesg: add --follow-new
authorKonstantin Khlebnikov <khlebnikov@yandex-team.ru>
Sat, 30 May 2020 14:07:53 +0000 (17:07 +0300)
committerKarel Zak <kzak@redhat.com>
Mon, 1 Jun 2020 07:55:49 +0000 (09:55 +0200)
Option --follow-new (-W) works the same as --follow (-w) but initially
seeks to the end of kernel ring buffer, so it prints only new messages.
Useful for capturing kernel messages during actions without past log.

Signed-off-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
bash-completion/dmesg
sys-utils/dmesg.1
sys-utils/dmesg.c

index 319605f8ee3957da36a38ece07d079e0e28a5ab1..02f2fc7a62d47612f17f37f2403f577ce5b557f5 100644 (file)
@@ -55,6 +55,7 @@ _dmesg_module()
                --time-format
                --userspace
                --follow
+               --follow-new
                --decode
                --help
                --version"
index 31bfb56f3f5e379efa28f63a2cc231a129f804df..61a6ce89465d60e80a26383d04267405fb18279d 100644 (file)
@@ -193,6 +193,9 @@ Print userspace messages.
 Wait for new messages.  This feature is supported only on systems with
 a readable /dev/kmsg (since kernel 3.5.0).
 .TP
+.BR \-W , " \-\-follow-new"
+Wait and print only new messages.
+.TP
 .BR \-x , " \-\-decode"
 Decode facility and level (priority) numbers to human-readable prefixes.
 .TP
index 1eb7cde3c1b2bc024b682cb72876406048f72389..ae1ebc74a2d91dd72f75588a016b717accfa810e 100644 (file)
@@ -190,6 +190,7 @@ struct dmesg_control {
        unsigned int    time_fmt;       /* time format */
 
        unsigned int    follow:1,       /* wait for new messages */
+                       end:1,          /* seek to the of buffer */
                        raw:1,          /* raw mode */
                        noesc:1,        /* no escape */
                        fltr_lev:1,     /* filter out by levels[] */
@@ -292,6 +293,7 @@ static void __attribute__((__noreturn__)) usage(void)
        fputs(_(" -s, --buffer-size <size>    buffer size to query the kernel ring buffer\n"), out);
        fputs(_(" -u, --userspace             display userspace messages\n"), out);
        fputs(_(" -w, --follow                wait for new messages\n"), out);
+       fputs(_(" -W, --follow-new            wait and print only new messages\n"), out);
        fputs(_(" -x, --decode                decode facility and level to readable string\n"), out);
        fputs(_(" -d, --show-delta            show time delta between printed messages\n"), out);
        fputs(_(" -e, --reltime               show local time and time delta in readable format\n"), out);
@@ -1127,7 +1129,7 @@ static int init_kmsg(struct dmesg_control *ctl)
         *
         * ... otherwise SYSLOG_ACTION_CLEAR will have no effect for kmsg.
         */
-       lseek(ctl->kmsg, 0, SEEK_DATA);
+       lseek(ctl->kmsg, 0, ctl->end ? SEEK_END : SEEK_DATA);
 
        /*
         * Old kernels (<3.5) allow to successfully open /dev/kmsg for
@@ -1336,6 +1338,7 @@ int main(int argc, char *argv[])
                { "file",          required_argument, NULL, 'F' },
                { "facility",      required_argument, NULL, 'f' },
                { "follow",        no_argument,       NULL, 'w' },
+               { "follow-new",    no_argument,       NULL, 'W' },
                { "human",         no_argument,       NULL, 'H' },
                { "help",          no_argument,       NULL, 'h' },
                { "kernel",        no_argument,       NULL, 'k' },
@@ -1375,7 +1378,7 @@ int main(int argc, char *argv[])
        textdomain(PACKAGE);
        close_stdout_atexit();
 
-       while ((c = getopt_long(argc, argv, "CcDdEeF:f:HhkL::l:n:iPprSs:TtuVwx",
+       while ((c = getopt_long(argc, argv, "CcDdEeF:f:HhkL::l:n:iPprSs:TtuVWwx",
                                longopts, NULL)) != -1) {
 
                err_exclusive_options(c, longopts, excl, excl_st);
@@ -1466,6 +1469,10 @@ int main(int argc, char *argv[])
                case 'w':
                        ctl.follow = 1;
                        break;
+               case 'W':
+                       ctl.follow = 1;
+                       ctl.end = 1;
+                       break;
                case 'x':
                        ctl.decode = 1;
                        break;