Shell function to tail a log file for a specific string for a specific time
#!/bin/bash
tail -f logfile | grep 'certain_word' | read -t 1200 dummy_var
[ $? -eq 0 ] && echo 'ok' || echo 'server not up'
This reads anything written to logfile, searches for certain_word, echos ok if all is good, otherwise after waiting 1200 seconds (20 minutes) it complains.
AIX Shell function to tail a log file for a specific string or for a specific time
You can try
tail -f -n0 "$yourfile" | grep -ql "yourstring"
on my Linux, this works (almost) as expected. tail -f -n0
produces all lines that are added to the file, grep -ql
quietly looks for a single match of "yourstring" in its input and exits afterwards.
Monitor tail of log file for string, if you don't find it, quit
If you want to find the string ${SEARCHED}
, you don't need the test command [ ]
.
( tail -f -n0 "$LOG_FILE" & ) | while IFS= read -r line; do
if $(echo "${line}" | grep -q "${SEARCHED}") ; then
Well, does the following command mean that the sub process is ended if the following file is created?
touch "MonitorRanAndIamProofWhen"
bash tail on a live log file, counting uniq lines with same date/time
Your problem is most likely related to buffering in your system, not anything intrinsically wrong with your line of code. I was able to create a test scenario where I could reproduce it - then make it go away. I hope it will work for you too.
Here is my test scenario. First I write a short script that writes the time to a file every 100 ms (approx) - this is my "log file" that generates enough data that uniq -c
should give me an interesting output every second:
#!/bin/ksh
while :
do
echo The time is `date` >> a.txt
sleep 0.1
done
(Note - I had to use ksh
which has the ability to do a sub-second sleep
)
In another window, I type
tail -f a.txt | uniq -c
Sure enough, you get the following output appearing every second:
9 The time is Thu Dec 12 21:01:05 EST 2013
10 The time is Thu Dec 12 21:01:06 EST 2013
10 The time is Thu Dec 12 21:01:07 EST 2013
9 The time is Thu Dec 12 21:01:08 EST 2013
10 The time is Thu Dec 12 21:01:09 EST 2013
9 The time is Thu Dec 12 21:01:10 EST 2013
10 The time is Thu Dec 12 21:01:11 EST 2013
10 The time is Thu Dec 12 21:01:12 EST 2013
etc. No delays. Important to note - I did not attempt to cut out the time. Next, I did
tail -f a.txt | cut -f7 -d' ' | uniq -c
And your problem reproduced - it would "hang" for quite a while (until there was 4k of characters in the buffer, and then it would vomit it all out at once).
A bit of searching online ( https://stackoverflow.com/a/16823549/1967396 ) told me of a utility called stdbuf . At that reference, it specifically mentions almost exactly your scenario, and they provide the following workaround (paraphrasing to match my scenario above):
tail -f a.txt | stdbuf -oL cut -f7 -d' ' | uniq -c
And that would be great… except that this utility doesn't exist on my machine (Mac OS) - it is specific to GNU coreutils. This left me unable to test - although it may be a good solution for you.
Never fear - I found the following workaround, based on the socat
command (which I honestly barely understand, but I adapted from the answer given at https://unix.stackexchange.com/a/25377 ).
Make a small file called tailcut.sh
(this is the "long_running_command" from the link above):
#!/bin/ksh
tail -f a.txt | cut -f7 -d' '
Give it execute permissions with chmod 755 tailcut.sh
. Then issue the following command:
socat EXEC:./tailcut.sh,pty,ctty STDIO | uniq -c
And hey presto - your lumpy output is lumpy no more. The socat
sends the output from the script straight to the next pipe, and uniq
can do its thing.
Related Topics
Differencebetween "Var=${Var:-Word}" and "Var=${Var:=Word}"
Can't Get Private Key with Openssl (No Start Line:Pem_Lib.C:703:Expecting: Any Private Key)
Getting Current Path in Variable and Using It
Cpu Affinity Masks (Putting Threads on Different Cpus)
How to Install R 3.1.2 on Linux Mint 17.1
Does Awk Cr Lf Handling Break on Cygwin
Finding Contents of One File in Another File
Unix 'Alias' Fails with 'Awk' Command
Run a Persistent Process via Ssh
How to Make a Bash Shell Script Interact with Another Command Line Program
/Usr/Bin/Perl: Bad Interpreter: Text File Busy
Building a Simple (Hello-World-Esque) Example of Using Ld's Option -Rpath with $Origin
Linux Combine Two Files by Column
How to Setup a Periodic Timer Callback in a Linux Kernel Module