mirror of
git://git.sv.gnu.org/coreutils
synced 2026-05-09 08:29:32 -04:00
f8726e05c4
* src/tail.c (tail_forever, tail_forever_inotify): Close a race in tail_forever_inotify where new data written after the file check by a now dead process, but before the pid check, is not output. We use the POSIX guarantee that read() and write() are serialized wrt each other even in separate processes, to assume full file consistency after exit() and so poll for new data _after_ the writer has exited. This also allows us to not redundantly _wait_ for new data if the process is dead. * tests/tail-2/pid: Remove the now partially invalid sub second sleep check as we now don't unconditionally wait, and replace it with a check for the redundant sleep. Also clarify some of the existing comments. * NEWS: Mention the fix.
57 lines
1.7 KiB
Bash
Executable File
57 lines
1.7 KiB
Bash
Executable File
#!/bin/sh
|
|
# Test the --pid option of tail.
|
|
|
|
# Copyright (C) 2003, 2006-2009 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/>.
|
|
|
|
if test "$VERBOSE" = yes; then
|
|
set -x
|
|
tail --version
|
|
fi
|
|
|
|
. $srcdir/test-lib.sh
|
|
getlimits_
|
|
|
|
touch here || framework_failure
|
|
|
|
fail=0
|
|
|
|
for inotify in ---disable-inotify ''; do
|
|
# Use tail itself to create a background process to monitor,
|
|
# which will auto exit when "here" is removed.
|
|
tail -f $inotify here &
|
|
bg_pid=$!
|
|
|
|
# Ensure that tail --pid=PID does not exit when PID is alive.
|
|
timeout 1 tail -f -s.1 --pid=$bg_pid $inotify here
|
|
test $? = 124 || fail=1
|
|
|
|
# Cleanup background process
|
|
kill $bg_pid
|
|
|
|
# Ensure that tail --pid=PID exits with success status when PID is dead.
|
|
# Use an unlikely-to-be-live PID
|
|
timeout 3 tail -f -s.1 --pid=$PID_T_MAX $inotify /dev/null
|
|
ret=$?
|
|
test $ret = 124 && skip_test_ "pid $PID_T_MAX present or tail too slow"
|
|
test $ret = 0 || fail=1
|
|
|
|
# Ensure tail doesn't wait for data when PID is dead
|
|
timeout 3 tail -f -s10 --pid=$PID_T_MAX $inotify /dev/null
|
|
test $? = 124 && fail=1
|
|
done
|
|
|
|
Exit $fail
|