coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Allow tail to display data after stream stops sending input after N


From: Pádraig Brady
Subject: Re: Allow tail to display data after stream stops sending input after N seconds
Date: Mon, 25 Apr 2022 16:56:21 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:97.0) Gecko/20100101 Thunderbird/97.0

On 25/04/2022 15:32, konsolebox wrote:
On Mon, Apr 25, 2022, 20:45 Pádraig Brady, <P@draigbrady.com 
<mailto:P@draigbrady.com>> wrote:

    On 24/04/2022 11:45, konsolebox wrote:
     > But this could work if there exists an option like -S which allows
     > tail to wait for N seconds before considering input as "stopped" and
     > then displaying currently absorbed input.
     >
     > Current workaround would be to use a temporary file and use sleep or
     > maybe some repeated inotify checks before running second tail but it's
     > messy.

    I'm not sure we need a separate option for this.
    tail(1) will promptly act upon closed input,
    so we can organize to close input upon a count
    (with head -n, or grep -m), or after a time with timeout(1).

    How about:

        timeout 10 \
        tail -f /var/log/messages -n +1 |
        grep -e something |
        tail

    If that didn't suffice, you could organize things to
    get the pid of a sleep process to pass to tail's --pid option:

        sleep 10 & sleep_pid=$!
        tail --pid=$sleep_pid -f /var/log/messages -n +1 |
        grep -e something |
        tail


But the goal here is not to terminate "tail -f" after a few seconds but limit 
filtered output to 10 lines and still keep reading incoming messages.

If you mean that another `tail -f | grep` should run after first set 
terminates, ensuring proper continuity if even possible would still be 
difficult, and it will not work on streams.

So far this is how I do it and it's awkward:

tail -f /var/log/messages -n +1 | grep -e something > temp & pid=$!
inotifywait -mqq -t 1 temp
tail -f --pid="$pid" temp
rm temp

Oh you want the timeout reset after any data is passed.
I.e. only stop when no data has arrived within X seconds.
The read(1) builtin may suffice for that?

  tail -f /var/log/messages -n +1 |
  while IFS= read -r -t10; do printf '%s\n' "$REPLY"; done |
  grep -e something |
  tail


If we added an option to tail(1) then it could be more flexible,
like --max-wait-time=... to close/ignore a file after wait time
has passed without any data, which would work with multiple files.
I'm not convinced such an option is warranted though
given the external tools available to manage this.

cheers,
Pádraig.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]