我有一个反应原生应用程序,我想写一个脚本的开始testing版本。 我需要击落: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
来扩展它 lsof -ti :8081 | grep node
,它什么都不返回。
所以我只需要进程id,把它带入kill -9 $PID
。
我认为你的整个方法是有缺陷的,你可能应该在systemd下运行你的服务(或者把它包装在一个loggingPID的systemV风格的start-stop脚本中),这将大大简化停止正确的服务。
或者,find一个特定进程的传统工具是pgrep
,相关的pkill
允许你轻松杀死它们:
pkill -9 -u node react-native-app-name
话虽如此,要回答你的字面问题:一般来说,停止正确的服务进程是在TCP端口上提供侦听器的服务进程,即用-sTCP:LISTEN
限制你的lsof
输出
lsof -i :8081 -sTCP:LISTEN |awk 'NR > 1 {print $2}' |xargs kill -15
lsof -i :8081 | awk '{system("kill -9 " $2)}'
应该做你想做的。 虽然有很多短暂的过程,但要注意一个非常高负载的系统。 这可能是你杀了错误的过程,因为有时候lsof的输出在一段时间内certificate不太可靠。