screen 导致“tail -F | grep”回显不匹配的行

Dal*_*lko 6 grep tail gnu-screen tee

这是 Ubuntu (3.13.0-29-generic #53),尝试做一个简单的 bash 脚本来监控匹配行的日志文件。

如果我执行以下操作,则 bash shell 中除了匹配项之外没有任何输出,这是预期的:

tail -F server.log | grep --line-buffered "word" | tee -a wordwatch.log

但是如果我尝试在屏幕上做同样的事情,会话就会收到来自监视日志文件的不匹配数据的垃圾邮件。显然,它显示了监视日志文件中的所有内容。此垃圾邮件不会出现在输出日志文件中。

screen -S "wordwatch" tail -F server.log | grep --line-buffered "word" | tee -a wordwatch.log

我做错了什么,如何阻止监视的日志向屏幕会话发送垃圾邮件?

Kon*_*bas 10

当您以这种方式启动管道时:

screen -S "wordwatch" tail -F server.log | grep --line-buffered "word" | tee -a wordwatch.log
Run Code Online (Sandbox Code Playgroud)

然后仅tail -F server.log在内部启动screen,其余所有连接到screen,而不是tail.

因此,您应该调用已经可以运行的 bash 脚本:

screen -S "wordwatch" myworkingscript.sh
Run Code Online (Sandbox Code Playgroud)

另一种方法是显式启动 shell 并将所有行传递给它:

screen -S "wordwatch" bash -c 'tail -F server.log | grep --line-buffered "word" | tee -a wordwatch.log'
Run Code Online (Sandbox Code Playgroud)

使用屏幕查看日志的另一种好方法是特殊配置:

#### 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
####
Run Code Online (Sandbox Code Playgroud)

screen 应该这样调用:

# screen -c /home/logger.screenrc
Run Code Online (Sandbox Code Playgroud)

要退出只需按下<CTRL-A><CTRL-\>并确认。