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@xxxxxxxxxxxxxx> --- bash-completion/dmesg | 1 + sys-utils/dmesg.1 | 3 +++ sys-utils/dmesg.c | 11 +++++++++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/bash-completion/dmesg b/bash-completion/dmesg index 319605f8ee39..02f2fc7a62d4 100644 --- a/bash-completion/dmesg +++ b/bash-completion/dmesg @@ -55,6 +55,7 @@ _dmesg_module() --time-format --userspace --follow + --follow-new --decode --help --version" diff --git a/sys-utils/dmesg.1 b/sys-utils/dmesg.1 index 31bfb56f3f5e..61a6ce89465d 100644 --- a/sys-utils/dmesg.1 +++ b/sys-utils/dmesg.1 @@ -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 diff --git a/sys-utils/dmesg.c b/sys-utils/dmesg.c index 1eb7cde3c1b2..ae1ebc74a2d9 100644 --- a/sys-utils/dmesg.c +++ b/sys-utils/dmesg.c @@ -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;