kill-port 清理占用端口的进程

背景

在日常开发中,经常出现端口莫名被占用的情况。比如要启动一个java服务,报错8080端口被占用,这时候就想着快速清理掉占用该端口的进程。

在Linux下,我们可以用熟悉的ss命令来找出进程并删除,但是macOS下,netstat我用的比较少,而且速度也很慢。

最近正好在学习Rust,所以就用Rust来写一个kill-port小工具,也算是入门系统编程了吧。

安装

1
2
3
$ git clone https://github.com/robberphex/kill-port.git
$ cargo build --release
# 将 ./target/release/kill-port 添加到PATH路径中。

使用方法

1
2
3
4
5
6
7
kill-port 0.1.0

USAGE:
kill-port [PORT]...

ARGS:
<PORT>... ports to find

例子:

1
2
# kill掉占用8080端口的进程
$ kill-port 8080

也可以同时清理多个端口:

1
2
3
$ kill-port 8080,5000,3000
# OR
$ kill-port 9000 3000 5000

原理

以macOS为例,简单说一下kill-port是如何工作的。

  1. 首先,调用proc_listpids获取所有进程的pid

这一块调用了libproc提供的proc_listpids函数。

  1. 对于每一个pid,调用list_all_fds_for_pid

这一块调用了libproc提供的proc_pidinfo函数。

  1. 对于每一个fd,调用get_fd_information

这一块调用了libproc提供的proc_pidfdinfo函数。

  1. 如果是tcp/udp socket,则解析出对应的信息(比如ip、端口、pid等信息)

从1至4,都是netstat2-rs的逻辑。
至于libproc,则是BSD sysctl的包装,可以参考Apple的文章https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/sysctl.3.html

  1. 对于每一个socket,如果端口是需要清理的端口,则调用kill来结束进程

这一块的功能是rust-psutil提供的。

后记

kill-port中,依赖的系统接口都有很好的rust封装;加上都是单线程编程,所以没有遇到太多的烧脑rust逻辑。

一次成功的rust入门!

kill-port 清理占用端口的进程

https://robberphex.com/kill-port/

作者

Robert Lu

发布于

2022-05-06

许可协议

评论