根据特定输出终止进程

根据特定输出终止进程

如何根据进程的特定输出终止该进程?例如,运行 Java 程序时java -jar xyz.jar,我想在标准输出上出现“在端口 8000 上启动服务器”行后终止该进程。

答案1

grep -m1考虑到以下脚本不适合您,可以使用以下脚本来完成:

#!/bin/bash

java -jar xyz.jar &> "/tmp/yourscriptlog.txt" &
processnumber=$!
tail -F "/tmp/yourscriptlog.txt" | awk  '/Started server on port 8000/ { system("kill '$processnumber'") }'

基本上,这个脚本stdout使用命令将你的java代码重定向到一个文件&> "/tmp/yourscriptlog.txt",第一行的最后一个 &使你的代码作为一个独立的进程运行,在下一行我们有这个进程的编号$!。有了进程号和日志文件,tail我们最终可以在打印所需的行时终止该进程。

答案2

java -jar xyz.jar | grep -m1 "Started server on port 8000"

答案3

我调整了 @Rafael 的答案,以适应像我这样的更复杂的情况,如果脚本不会简单地让自己被推到后台。

打开第一个tmux会话并输入命令(使用tee而不是重定向来查看实时输出),然后使用 Ctrl-B D 分离:

java -jar xyz.jar &> '/var/log/myscript.log'

在另一个 tmux 会话中,处理终止:

tail -F '/var/log/myscript.log' | awk '/Started server on port 8000/ { system("tmux kill-session -t 0") }'

如果您已经有其他正在运行的 tmux 会话,请使用命名会话。

相关内容