最近周末在维护一个开源项目,叫做 air。它是一个 Golang 的热加载代码的工具,会监听本地的文件变化,然后自动重新加载。
遇到的问题
最近遇到一个特别有意思的问题,就是使用 kill -9 pid
命令杀死进程的时候虽然会杀死它的子进程,但是它的孙子进程还是会继续存活。
背景
简而言之,就是我们的热加载组件会运行命令,然后会监听文件变化,一旦文件变化就会 kill 掉之前进程,然后重新编译代码,再执行运行的命令。
但是遇到一个用户提了这样一个问题: https://github.com/cosmtrek/air/issues/216#issuecomment-982348931 在执行命令的时候使用 dlv exec --accept-multiclient --log --headless --continue --listen :2345 --api-version 2 ./tmp/main
来运行代码与开启调试,我们的组件不会彻底的将进程杀死,而是会继续存活。导致下次一次起来的时候对应的端口会被占用。
排查问题
通过 ps -efj | grep "tmp/main"
能很清楚的看到实际上运行这条命令会起来三个进程
|
< |