Package: coreutils;
Reported by: Jim Meyering <jim <at> meyering.net>
Date: Sun, 24 Apr 2011 21:24:01 UTC
Severity: normal
Done: Jim Meyering <jim <at> meyering.net>
Bug is archived. No further changes may be made.
Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
From: Jim Meyering <jim <at> meyering.net> To: Tim Underwood <timunderwood <at> gmail.com> Cc: bug-coreutils <at> gnu.org Subject: Re: tail bug - starting in 7.5 "tail --follow=name" behaves like "tail --follow=name --retry" Date: Sun, 24 Apr 2011 23:22:46 +0200
Tim Underwood wrote: > Going from Ubuntu 10.04 (coreutils 7.4) to Ubuntu 10.10 (coreutils 8.5) I > noticed that "tail --follow=name" started behaving like "tail --follow=name > --retry". It looks like the issue started in 7.5 and still exists in 8.9. > > To reproduce: > > tail --follow=name this_file_does_not_exist > > The expected behavior is: > > $ ./coreutils-7.4/src/tail --follow=name this_file_does_not_exist > ./coreutils-7.4/src/tail: cannot open `this_file_does_not_exist' for > reading: No such file or directory > ./coreutils-7.4/src/tail: no files remaining > > The wrong behavior is: > > $ ./coreutils-7.5/src/tail --follow=name this_file_does_not_exist > ./coreutils-7.5/src/tail: cannot open `this_file_does_not_exist' for > reading: No such file or directory > <tail waits forever for this_file_does_not_exist to become available which > is what --retry is for> > > Here's the wrong behavior on 8.9: > > $ ./coreutils-8.9/src/tail --follow=name this_file_does_not_exist > ./coreutils-8.9/src/tail: cannot open `this_file_does_not_exist' for > reading: No such file or directory > <waits forever...> > > My specific use case is to tail a log file until it gets deleted at which > point tail should exit allowing my script to continue. Thanks again. Here's the fix I expect to use: From 79a476abb35a69f409e2848019c8ebc24cc687cf Mon Sep 17 00:00:00 2001 From: Jim Meyering <meyering <at> redhat.com> Date: Sun, 24 Apr 2011 23:20:01 +0200 Subject: [PATCH] tail --follow=name no longer implies --retry * src/tail.c (tail_forever_inotify): Just as without inotify, tail --follow=name now terminates when the last tailed-by-name file is unlinked or moved aside. This bug was introduced on 2009-06-15 via commit ae494d4b, "tail: use inotify if it is available". Reported by Tim Underwood in http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/22286 * NEWS (Bug fixes): Mention this. * tests/tail-2/follow-name: Test for this. * tests/Makefile.am (TESTS): Add it. --- NEWS | 5 +++++ THANKS.in | 1 + src/tail.c | 10 ++++++++++ tests/Makefile.am | 1 + tests/tail-2/follow-name | 32 ++++++++++++++++++++++++++++++++ 5 files changed, 49 insertions(+), 0 deletions(-) create mode 100755 tests/tail-2/follow-name diff --git a/NEWS b/NEWS index 7bc2ef3..3307e71 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,11 @@ GNU coreutils NEWS -*- outline -*- * Noteworthy changes in release ?.? (????-??-??) [?] +** Bug fixes + + tail's --follow=name option no longer implies --retry on systems + with inotify support. [bug introduced in coreutils-7.5] + ** Changes in behavior cp's extent-based (FIEMAP) copying code is more reliable in the face diff --git a/THANKS.in b/THANKS.in index 342a52c..d1ca380 100644 --- a/THANKS.in +++ b/THANKS.in @@ -560,6 +560,7 @@ Tim J. Robbins tjr <at> FreeBSD.org Tim Mooney mooney <at> dogbert.cc.ndsu.NoDak.edu Tim Ryan Tim_Ryan <at> bnz.co.nz Tim Smithers mouse <at> dmouse.com.au +Tim Underwood timunderwood <at> gmail.com Tim Waugh twaugh <at> redhat Toby Peterson toby <at> opendarwin.org Todd A. Jacobs tjacobs <at> codegnome.org diff --git a/src/tail.c b/src/tail.c index 88fbd10..e6d8164 100644 --- a/src/tail.c +++ b/src/tail.c @@ -1432,6 +1432,16 @@ tail_forever_inotify (int wd, struct File_spec *f, size_t n_files, struct File_spec *fspec; struct inotify_event *ev; + /* When following by name without --retry, and the last file has + been unlinked or renamed-away, diagnose it and return. */ + if (follow_mode == Follow_name + && ! reopen_inaccessible_files + && hash_get_n_entries (wd_to_name) == 0) + { + error (0, 0, _("no files remaining")); + return false; + } + /* When watching a PID, ensure that a read from WD will not block indefinitely. */ if (pid) diff --git a/tests/Makefile.am b/tests/Makefile.am index 685eb52..2f4a561 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -489,6 +489,7 @@ TESTS = \ tail-2/assert-2 \ tail-2/big-4gb \ tail-2/flush-initial \ + tail-2/follow-name \ tail-2/follow-stdin \ tail-2/pipe-f \ tail-2/pipe-f2 \ diff --git a/tests/tail-2/follow-name b/tests/tail-2/follow-name new file mode 100755 index 0000000..ef9434a --- /dev/null +++ b/tests/tail-2/follow-name @@ -0,0 +1,32 @@ +#!/bin/sh +# ensure that --follow=name does not imply --retry + +# Copyright (C) 2011 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +print_ver_ tail + +cat <<\EOF > exp || framework_failure_ +tail: cannot open `no-such' for reading: No such file or directory +tail: no files remaining +EOF + +timeout 10 tail --follow=name no-such > out 2> err +test $? = 1 || fail=1 + +compare err exp || fail=1 + +Exit $fail -- 1.7.5.rc3.316.gd1ff9
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.