![根据特定输出终止进程](https://linux22.com/image/164615/%E6%A0%B9%E6%8D%AE%E7%89%B9%E5%AE%9A%E8%BE%93%E5%87%BA%E7%BB%88%E6%AD%A2%E8%BF%9B%E7%A8%8B.png)
如何根据进程的特定输出终止该进程?例如,运行 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 会话,请使用命名会话。