OSX El Capitan无法正常关闭服务器端口问题求助
解决OSX El Capitan终端关闭后服务器进程残留的问题
我在El Capitan 10.11.6上也遇到过完全一样的糟心事!不管是Node.js还是Rails服务器,关了终端进程还赖着占端口,每次手动查PID杀进程真的够烦的。下面给你从快速偷懒到彻底根治的方案:
一、快速替代手动查进程的命令
不用再敲冗长的netstat -vanp tcp | grep [PORT]了,用lsof更简单直接,甚至可以一键杀掉进程:
- 先查占用端口的进程PID:
lsof -i :[你的端口号] - 或者直接一步到位杀进程(把
[PORT]换成你的端口,比如3000):kill -9 $(lsof -t -i :[PORT])-t参数会只返回PID,省去你手动复制的步骤。
二、彻底根治:让终端关闭时自动终止子进程
这个问题本质是El Capitan的终端默认不会在关闭时自动终止所有子进程,导致服务器进程变成“孤儿”被系统接管继续运行。有两种方法解决:
方法1:修改Shell配置,让退出时发送终止信号
如果你用的是Bash(终端默认Shell):
编辑~/.bash_profile文件(没有就新建一个),添加一行:shopt -s huponexit保存后执行
source ~/.bash_profile生效,以后关闭终端时,Shell会给所有子进程发送HUP信号,让它们自动终止。如果你用的是Zsh:
编辑~/.zshrc文件,添加一行:setopt HUP同样执行
source ~/.zshrc生效。
方法2:启动服务器时用exec命令绑定进程
启动服务器时,在命令前加上exec,比如:
exec node server.js # 或者 Rails 的情况 exec rails s
exec会让服务器进程直接替换当前的Shell进程,这样当你关闭终端时,这个进程也会跟着被终止,从根源上避免残留。
例外情况:如果进程还是不终止
极少数情况下,有些进程会忽略HUP信号,这时候可以试试启动服务器时用trap命令强制捕获退出信号,不过这种情况在Node和Rails里很少见。如果真碰到了,可以在启动命令前加:
trap "exit" INT TERM; node server.js
不过上面的两种方法基本能解决绝大多数情况了。
内容的提问来源于stack exchange,提问作者Jacek717
相关产品推荐
相关产品推荐

