From: Pádraig Brady
Date: Fri, 20 Dec 2024 14:28:11 +0000 (+0000) Subject: tail: always fail when followed files become inaccessible X-Git-Tag: v9.6~47 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8b9fa9d0742d4a2070716d098bad489dad2d9bb9;p=thirdparty%2Fcoreutils.git tail: always fail when followed files become inaccessible * src/tail.c (tail_forever): Without --retry, exit with failure status like we do for the inotify case (since v8.11-15-g61de57cd2). This is also consistent with the failure exit if no file was accessible at tail startup. * tests/tail/follow-stdin.sh: Tweak due to earlier exit. * tests/tail/follow-name.sh: Test with and without inotify. * NEWS: Mention the bug fix. --- diff --git a/NEWS b/NEWS index 332e862d60..9c6f2fb0dc 100644 --- a/NEWS +++ b/NEWS @@ -32,6 +32,10 @@ GNU coreutils NEWS -*- outline -*- file names that are moved elsewhere within the same file system. [bug introduced in coreutils-8.24] + `tail --follow` without --retry, will consistently exit with failure status + where inotify is not used, when all followed files become inaccessible. + [This bug was present in "the beginning".] + 'tail -c 4096 /dev/zero' no longer loops forever. [This bug was present in "the beginning".] diff --git a/src/tail.c b/src/tail.c index 8cefb9c07a..19f5725560 100644 --- a/src/tail.c +++ b/src/tail.c @@ -1305,7 +1305,7 @@ tail_forever (struct File_spec *f, size_t n_files, double sleep_interval) if (! any_live_files (f, n_files)) { - error (0, 0, _("no files remaining")); + error (EXIT_FAILURE, 0, _("no files remaining")); break; } diff --git a/tests/tail/follow-name.sh b/tests/tail/follow-name.sh index f92839c9e7..c22b5dd80c 100755 --- a/tests/tail/follow-name.sh +++ b/tests/tail/follow-name.sh @@ -29,14 +29,19 @@ returns_ 1 timeout 10 tail --follow=name no-such > out 2> err || fail=1 sed '/inotify cannot be used/d' err > k && mv k err compare exp err || fail=1 -# Between coreutils 8.34 and 9.5 inclusive, tail would have -# waited indefinitely when a file was moved to the same file system +# Between coreutils 8.34 and 9.5 inclusive, with inotify, tail would +# have waited indefinitely when a file was moved to the same file system. +# Also without inotify tail would have exited with success. cleanup_() { kill $pid 2>/dev/null && wait $pid; } -touch file || framework_failure_ -timeout 10 tail --follow=name file & pid=$! -sleep .1 # Usually in inotify loop here -mv file file.unfollow || framework_failure_ -wait $pid -test $? = 1 || fail=1 +fastpoll='-s.1 --max-unchanged-stats=1' # speedup non inotify systems +for inotify in '' '---disable-inotify'; do + touch file || framework_failure_ + timeout 10 tail --follow=name $fastpoll file & pid=$! + sleep .1 # Usually in tail_forever{,_inotify}() here + mv file file.unfollow || framework_failure_ + wait $pid + test $? = 1 || fail=1 + rm -f file file.unfollow || framework_failure_ +done Exit $fail diff --git a/tests/tail/follow-stdin.sh b/tests/tail/follow-stdin.sh index 799353a0e4..ecc8d8a79e 100755 --- a/tests/tail/follow-stdin.sh +++ b/tests/tail/follow-stdin.sh @@ -61,7 +61,6 @@ cat <<\EOF >exp || framework_failure_ tail: cannot fstat 'standard input' tail: error reading 'standard input' tail: no files remaining -tail: - EOF sed 's/\(tail:.*\):.*/\1/' errt > err || framework_failure_ compare exp err || fail=1