仅当端口打开时如何杀死在端口上运行的进程?

obl*_*ion 0 unix linux bash

目前,我可以使用以下命令终止端口上运行的进程:

//other scripts that should be executed
...........................
sudo kill $( sudo lsof -i:9005 -t )
...........................
//other scripts that should be executed
Run Code Online (Sandbox Code Playgroud)

现在,我想首先测试端口 9005 是否确实打开,然后只尝试杀死它。如果端口没有打开,我不想执行杀死脚本。我想确保无论端口是打开还是关闭,后续脚本都会执行。所以,我正在寻找类似的东西:

//other scripts that should be executed
.............
<test-if-port-9005-is-open>  && sudo kill $( sudo lsof -i:9005 -t )
.............
// other scripts that should be executed
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

小智 5

你可以这样做:

nc -zv 127.0.0.1 9005 && sudo kill $( sudo lsof -i:9005 -t )
Run Code Online (Sandbox Code Playgroud)

如果在提供的端口上 TCP 连接成功,它将终止该进程。然后它继续前进。在 macOS High Sierra 上进行了测试。


tri*_*eee 5

lsof -i:9005 -t如果我正确理解你的问题,当端口未打开时,根据定义, 输出将为空。xargsLinux 上有一个选项可以处理这个问题:

sudo lsof -i:9005 -t | xargs -r sudo kill
Run Code Online (Sandbox Code Playgroud)

lsof或者您可以简单地检查;的退出代码 如果没有找到任何要报告的内容,它将是非零以表示错误:

if pids=$(sudo lsof -i:9005 -t); then
    sudo kill $pids
fi
Run Code Online (Sandbox Code Playgroud)