This is Ubuntu (3.13.0-29-generic #53), trying to do a simple bash script to monitor a log file for matching lines.
If I do the following, there is no output in the bash shell except for matches, which is expected:
tail -F server.log | grep --line-buffered "word" | tee -a wordwatch.log
But if I try to do the same thing in a screen, the session is spammed with unmatched data from the watched log file. Apparently it's showing everything from the watched log file. This spam does not appear in the output log file.
screen -S "wordwatch" tail -F server.log | grep --line-buffered "word" | tee -a wordwatch.log
What am I doing wrong and how do I stop the watched log from spamming the screen session?
When you launch the pipe such way:
screen -S "wordwatch" tail -F server.log | grep --line-buffered "word" | tee -a wordwatch.log
then only tail -F server.log
is launched within screen
and all the rest is connected to the screen
, not the tail
.
Therefore you should invoke your bash script that works already:
screen -S "wordwatch" myworkingscript.sh
The other approach is to launch the shell explicitly and pass all the line to it:
screen -S "wordwatch" bash -c 'tail -F server.log | grep --line-buffered "word" | tee -a wordwatch.log'
Also the other good way to watch logs with screen - is the special config:
#### logger.screenrc
sessionname logger
hardstatus alwaysignore
split
split
screen -t "Log One" 1 sh -c 'tail -F /a/b/c | egrep "xxxx" | tee -a '
focus
screen -t "Log Two" 2 /home/somescript.sh
focus
screen -t "Messages" 3 /home/otherscript.sh
focus
####
screen
should be invoked like that:
# screen -c /home/logger.screenrc
To exit just press <CTRL-A><CTRL-\>
and confirm.