Linux查看端口占用情况可以用 lsof 和 netstat 命令。
lsof
示例
查看 12000 端口占用情况
chengqiandu$ lsof -i:12000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ___go_bui 30423 chengqiandu 3u IPv6 0x3e702d30210b9d45 0t0 TCP *:entextxid (LISTEN)
12000 端口被 ___go_bui 占用。
lsof -i 需要 root 用户的权限来执行。输出各列信息的意义如下:
- COMMAND:进程的名称
- PID: 进程标识符
- USER: 进程所有者
- FD: 文件描述符,应用程序通过文件描述符识别该文件。如 cwd, txt等
- TYPE: 文件类型,如 DIR, REG 等
- DEVICE: 指定磁盘的名称
- SIZE/OFF: 文件的大小
- NODE: 索引文件,文件在磁盘上的标识
- NAME: 打开文件的确切名称
为什么是 SIZE/OFF? TODO 复制上述列,用空格分开成每行,在行首加入 ul 标记。如何用 vim 或其他编辑器快速实现。
其他
更多 lsof 的命令如下
lsof -i:8080 // 查看8080端口占用 lsof abc.txt // 显示开启文件 abc.txt 的进程 lsof -c abc // 显示 abc 进程现在打开的文件 lsof -c -p 1234 // 列出进程号为1234的进程所打开的文件 lsof -g gid // 显示归属 gid 的进程情况 lsof +d /usr/local/ // 显示目录下被进程开启的文件 lsof +D /usr/local/ // 同上,但是会搜索目录下的目录,时间较长 lsof -d 4 // 显示fd 为4的进程 lsof -i -U // 显示所有打开端口和 UNIX domain文件
netstat
含义
Linux netstat -tunlp 用于显示 tcp,udp 的端口和进程等相关情况。
- -tcp 显示 tcp 相关选项
- -udp 显示 udp 相关选项
- -n 拒绝显示别名,能显示数字的全部转化为数字
- -listen 显示在 Listen 监听的服务状态
- -p 显示简历相关链接的程序名
示例
Linux 下 netstat 查看 12500 端口占用情况语法格式
$ sudo netstat -tunlp | grep 12500 tcp6 0 0 :::12500 :::* LISTEN 5683/docker-proxy
Mac 下 netstat 查看12000端口占用情况语法格式
chengqiandu$ netstat -an | grep 12000 tcp46 0 0 *.12000 *.* LISTEN
kill
示例
在查到端口占用的进程后,如果要杀掉对应的进程可以使用kill命令
kill -9 PID
kill 的参数为系统信号
$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
总结
Linux很多命令实际上是很无厘头的,比如并不是严格按照首字母缩写,有些是缩写,有些是简写,所以导致学习曲线并不很平滑, 并不是很 user-friendly , 但是因为占据了很大的服务器市场份额,很多时候不得不学习,这并不意味着这些工具设计有多 好。至少现在我认为,好的设计应该是只有几条很简单的规则。
需要注意的是有些命令在 mac 下跟 Linux 下支持的参数是不一样的,比如 netstat。
总的来说,保持谦虚、开放、自由和不迷信的心态去对待每一件值得学习的事就 ok 了。