![从 lsof 列表获取 PID](https://linux22.com/image/703351/%E4%BB%8E%20lsof%20%E5%88%97%E8%A1%A8%E8%8E%B7%E5%8F%96%20PID.png)
我有一个 react-native 应用程序,我想编写一个脚本来启动测试版本。如果 :8081 端口处于活动状态,我需要关闭它。命令:
lsof -i :8081
kill -9 <PID>
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)
我真正需要的是节点服务的 pid(在本例中为 16210)。我如何从 lsof 获取它?
我尝试lsof -ti :8081
只返回 pid,但它返回了所有内容。我尝试使用 grep: 来扩展它,lsof -ti :8081 | grep node
但它什么也不返回。
所以我只需要进程 id,就可以将其带入kill -9 $PID
。
答案1
我认为你的整个方法都是有缺陷的,你应该在 systemd 下运行你的服务(或者将其包装在记录 PID 的 systemV 风格的启动-停止脚本中),这将大大简化停止正确的服务。
另外,查找特定进程的常规工具是pgrep
并且相关功能pkill
可以让你轻松杀死它们:
pkill -9 -u node react-native-app-name
话虽如此,回答你的字面问题:一般来说,要停止的正确服务进程是那些在该 TCP 端口上提供侦听器的服务进程,即lsof
使用以下方式限制你的输出-sTCP:LISTEN
lsof -i :8081 -sTCP:LISTEN |awk 'NR > 1 {print $2}' |xargs kill -15
答案2
最简单的杀戮方式——
kill $(lsof -ti:8081)
这将自动终止循环中获取的所有进程 ID。
只终止监听端口的进程 -
kill $(lsof -t -sTCP:LISTEN -i:8081)
答案3
lsof -i :8081 | awk '{system("kill -9 " $2)}'
应该可以做你想做的事。不过,在负载非常高、有很多短命进程的系统上要小心。你可能杀死了错误的进程,因为有时 lsof 的输出随着时间的推移被证明不太可靠。