Eri*_*ric 11 bash logs pipe search selenium
我正在使用 bash 脚本启动 Selenium 服务器,正如您从下面日志中的时间戳中看到的那样,这件事需要大约 32 秒才能完全上线:
Feb 28, 2012 10:19:02 PM org.openqa.grid.selenium.GridLauncher main
INFO: Launching a standalone server
22:19:02.835 INFO - Java: Sun Microsystems Inc. 20.0-b11
22:19:02.836 INFO - OS: Linux 2.6.32-220.4.1.el6.x86_64 amd64
22:19:02.852 INFO - v2.19.0, with Core v2.19.0. Built from revision 15849
22:19:02.988 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub
22:19:02.990 INFO - Version Jetty/5.1.x
22:19:02.992 INFO - Started HttpContext[/selenium-server/driver,/selenium-server/driver]
22:19:02.993 INFO - Started HttpContext[/selenium-server,/selenium-server]
22:19:02.993 INFO - Started HttpContext[/,/]
22:19:34.552 INFO - Started org.openqa.jetty.jetty.servlet.ServletHandler@488e32e7
22:19:34.552 INFO - Started HttpContext[/wd,/wd]
22:19:34.555 INFO - Started SocketListener on 0.0.0.0:4444
22:19:34.555 INFO - Started org.openqa.jetty.jetty.Server@7d29f3b5
Run Code Online (Sandbox Code Playgroud)
与其在启动服务器后使用“sleep 32”命令(在继续之前延迟脚本),我希望我的 bash 脚本等到它看到字符串“Started SocketListener”,然后继续。那可能吗?
您可以使用tail -f来随着文件的增长不断读取文件。小心你喂的tail -f东西。您可以通过管道tail -f输入一个过滤器,等待所需的日志行并退出。如果您tail -f通过管道连接到另一个过滤器的过滤器,则行不通,因为中间过滤器将缓冲其输出。这有效:
: >file.log # create an empty log file
start-selenium-session --log-file=file.log &
{ tail -n +1 -f file.log & } | sed -n '/Started SocketListener/q'
speak-to-socket
Run Code Online (Sandbox Code Playgroud)
请注意,我放在tail背景中。这是因为当sed找到所需的行时,它会退出,但只要tail等待下一行,管道就会继续运行,如果根本不会立即出现¹。tail将在下一行出现时退出并收到SIGPIPE. tail如果在没有写入任何行的情况下删除日志,这可能会留下一个流浪的进程(获取tail进程的 PID以在sed退出时杀死它是可能的,但很棘手)。
¹感谢Peter.O指出早期版本中的错误。
您可以将其添加到脚本中以实现暂停:
perl -e 'use File::Tail;
my $ref=tie *FH,"File::Tail",(name=>"/var/log/messages",maxinterval=>1);
while(<FH>) { exit if /Started SocketListener/ };'
Run Code Online (Sandbox Code Playgroud)
它利用 perl File::Tail模块来表现得像tail -f logfile | grep Started SocketListener.
将 /var/log/message 替换为适当的日志文件。请注意,如果“Started SocketListener”从未出现,它将永远挂起。