kill-port 清理占用端口的进程
背景
在日常开发中,经常出现端口莫名被占用的情况。比如要启动一个java服务,报错8080端口被占用,这时候就想着快速清理掉占用该端口的进程。
在Linux下,我们可以用熟悉的ss
命令来找出进程并删除,但是macOS下,netstat我用的比较少,而且速度也很慢。
最近正好在学习Rust,所以就用Rust来写一个kill-port小工具,也算是入门系统编程了吧。
安装
1 | $ git clone https://github.com/robberphex/kill-port.git |
使用方法
1 | kill-port 0.1.0 |
例子:
1 | # kill掉占用8080端口的进程 |
也可以同时清理多个端口:
1 | $ kill-port 8080,5000,3000 |
原理
以macOS为例,简单说一下kill-port是如何工作的。
- 首先,调用
proc_listpids
获取所有进程的pid
这一块调用了libproc提供的proc_listpids
函数。
- 对于每一个pid,调用list_all_fds_for_pid
这一块调用了libproc提供的proc_pidinfo
函数。
- 对于每一个fd,调用get_fd_information
这一块调用了libproc提供的proc_pidfdinfo
函数。
- 如果是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。
- 对于每一个socket,如果端口是需要清理的端口,则调用
kill
来结束进程
这一块的功能是rust-psutil
提供的。
后记
kill-port中,依赖的系统接口都有很好的rust封装;加上都是单线程编程,所以没有遇到太多的烧脑rust逻辑。
一次成功的rust入门!
kill-port 清理占用端口的进程