查找macOS上监听指定端口的PID 解决bash脚本启动服务端口占用问题
macOS下获取指定端口监听PID的方法
macOS 系统可以直接用 lsof 命令获取指定端口的监听进程PID,参数 -t 会过滤掉其他输出只返回PID值,非常适合在脚本中调用:
# 获取3001端口的监听PID lsof -ti :3001
如果对应端口没有进程监听,命令会返回空,你可以在杀进程的时候加错误忽略,避免脚本报错:
# 杀死3001端口的进程,没有对应进程时不抛出错误 kill $(lsof -ti :3001) 2>/dev/null
写入.pid文件的实现方式
完全可以将启动的进程PID写入.pid文件,后续停止服务时直接读取文件中的PID杀死进程即可,比每次查询端口效率更高,也不会误杀其他占用端口的无关进程。
bash 中可以用内置变量 $! 获取最近一个后台运行进程的PID,启动进程后直接写入文件即可。
修改后的完整启动脚本示例
#!/usr/bin/env bash export PORT="3001" export API_PORT="5001" export MAIN_URL="http://localhost:" # 先杀死占用对应端口的旧进程 kill $(lsof -ti :$PORT) 2>/dev/null kill $(lsof -ti :$API_PORT) 2>/dev/null # 启动前端服务,写入PID文件 cd Client npm run dev & echo $! > ../client.pid cd .. # 启动后端服务,写入PID文件 nodemon index.js & echo $! > server.pid
如果需要单独写一个停止服务的脚本,可以参考如下内容:
#!/usr/bin/env bash # 读取PID文件杀死进程,删除PID文件 kill $(cat client.pid) 2>/dev/null && rm -f client.pid kill $(cat server.pid) 2>/dev/null && rm -f server.pid
内容的提问来源于stack exchange,提问作者TheMachineX
相关产品推荐
相关产品推荐

