从 lsof 列表中获取 PID

Pum*_*eed 2 lsof pid kill-process

我有一个 react-native 应用程序,我想为开始测试版本编写一个脚本。如果 :8081 端口还活着,我需要击落它。命令:

lsof -i :8081
kill -9 <PID>
Run Code Online (Sandbox Code Playgroud)

lsof 返回此结果:

    COMMAND     PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
chrome     2423 loow  127u  IPv4 13749099      0t0  TCP localhost.localdomain:36650->localhost.localdomain:tproxy (ESTABLISHED)
qemu-syst 15091 loow   64u  IPv4 13795587      0t0  TCP localhost.localdomain:43518->localhost.localdomain:tproxy (ESTABLISHED)
qemu-syst 15091 loow   66u  IPv4 13795588      0t0  TCP localhost.localdomain:43520->localhost.localdomain:tproxy (ESTABLISHED)
qemu-syst 15091 loow   89u  IPv4 13777485      0t0  TCP localhost.localdomain:40500->localhost.localdomain:tproxy (ESTABLISHED)
node      16210 loow   16u  IPv6 13747716      0t0  TCP *:tproxy (LISTEN)
node      16210 loow   18u  IPv6 13751322      0t0  TCP localhost.localdomain:tproxy->localhost.localdomain:36650 (ESTABLISHED)
node      16210 loow   19u  IPv6 13798473      0t0  TCP localhost.localdomain:tproxy->localhost.localdomain:43518 (ESTABLISHED)
node      16210 loow   21u  IPv6 13798475      0t0  TCP localhost.localdomain:tproxy->localhost.localdomain:43520 (ESTABLISHED)
node      16210 loow   27u  IPv6 13777958      0t0  TCP localhost.localdomain:tproxy->localhost.localdomain:40500 (ESTABLISHED)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我真正需要的是节点服务的 pid 16210。如何从 lsof 获取它?

lsof -ti :8081试过只返回pids,但它返回所有。我试图用 grep: 扩展它lsof -ti :8081 | grep node,它什么都不返回。

所以我只需要进程 id,就可以将它放入kill -9 $PID.

HBr*_*ijn 8

我认为您的整个方法有缺陷,您可能应该在 systemd 下运行您的服务(或将其包装在记录 PID 的 systemV 样式启动-停止脚本中),这将大大简化停止正确服务的过程。

或者,查找特定进程的常规工具是pgrep,相关联的工具pkill可让您轻松杀死它们:

pkill -9 -u node  react-native-app-name
Run Code Online (Sandbox Code Playgroud)

话虽如此,要回答您的字面问题:通常要停止的正确服务进程是在该 TCP 端口上提供侦听器的服务进程,即限制您的lsof输出-sTCP:LISTEN

lsof -i :8081 -sTCP:LISTEN |awk 'NR > 1 {print $2}'  |xargs kill -15
Run Code Online (Sandbox Code Playgroud)


小智 8

最简单的杀人方式——

kill $(lsof -ti:8081)
Run Code Online (Sandbox Code Playgroud)

这将自动终止循环中获取的所有进程 ID。

仅终止侦听端口的进程 -

kill $(lsof -t -sTCP:LISTEN -i:8081)
Run Code Online (Sandbox Code Playgroud)


小智 5

lsof -i :8081 | awk '{system("kill -9 " $2)}'
Run Code Online (Sandbox Code Playgroud)

应该做你想做的事。不过,在具有大量短期进程的负载非常高的系统上要小心。可能是您杀死了错误的进程,因为有时 lsof 的输出随着时间的推移被证明不太可靠。