Linux查看端口占用情况可以用 lsof 和 netstat 命令。

lsof

含义

lsist openfile 是一个列出当前系统打开文件的命令。 lsof 查看端口占用情况语法格式

lsof -i:端口号

示例

查看 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

其他

更多 netstat 命令

netstat -ntlp // 查看当前所有tcp端口
netstat -ntulp | grep 80 // 查看所有80端口使用情况

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

查看公网ip

经常需要查看公网ip

curl ifconfig.me

其他

实际上上述命令就是请求了一个网站,内容是请求客户端的ip,还有其他信息

curl ifconfig.me/all.json

可以返回一些其他信息。

总结

Linux很多命令实际上是很无厘头的,比如并不是严格按照首字母缩写,有些是缩写,有些是简写,所以导致学习曲线并不很平滑, 并不是很 user-friendly , 但是因为占据了很大的服务器市场份额,很多时候不得不学习,这并不意味着这些工具设计有多 好。至少现在我认为,好的设计应该是只有几条很简单的规则。

需要注意的是有些命令在 mac 下跟 Linux 下支持的参数是不一样的,比如 netstat。

总的来说,保持谦虚、开放、自由和不迷信的心态去对待每一件值得学习的事就 ok 了。