版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/momDIY/article/details/79965955
当我们启动服务时可能出现端口号被占用的情况,此时可以用过通过想要使用的端口号查看此端口号上运行的进程,拿到这个进程Id,从而关闭进程使得待运行的服务正常运行。以nodejs为例:
打印了下完整的端口占用的错误对象信息:
{ Error: listen EADDRINUSE :::7001
at Object._errnoException (util.js:1022:11)
at _exceptionWithHostPort (util.js:1044:20)
at Server.setupListenHandle [as _listen2] (net.js:1351:14)
at listenInCluster (net.js:1392:12)
at Server.listen (net.js:1476:7)
at Object.<anonymous> (/Users/stevenlee/github/bebetter/eggjs-note-steven/demo/001-mini/index.js:22:8)
at Module._compile (module.js:643:30)
at Object.Module._extensions..js (module.js:654:10)
at Module.load (module.js:556:32)
at tryModuleLoad (module.js:499:12)
code: 'EADDRINUSE',
errno: 'EADDRINUSE',
syscall: 'listen',
address: '::',
port: 7001 }
也就是常见的EADDRINUSE
报错。
一、查看某个端口运行的进程
查看端口运行的进程一般有两种方式,netstat
或lsof
命令。(端口号以7001为例)
1.使用netstat
命令
//输出某个端口当前运行的进程信息
$ netstat -an | grep 7001
// tcp46 0 0 *.7001 *.* LISTEN
//输出某个端口当前运行的进程信息及进程Id等信息
$ netstat -anv | grep 7001
//tcp46 0 0 *.7001 *.* LISTEN 131072 131072 16000 0
- 以上命令输出了一条结果,代表7001端口此时只有一个进程
- 输出结果的倒数第二个参数(16000)对应的就是该进程的进程Id
2.使用lsof
命令
注:lsof
命令属于Linux命令,在mac系统或linux系统可直接使用,暂不适用于windows系统。
$ lsof -i:7001
//输出结果:
// COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
// node 16000 stevenlee 13u IPv6 0x308d6494ec0fe381 0t0 TCP *:afs3-callback (LISTEN)
对应输出描述如下:
输出名 | 描述 |
---|---|
COMMAND | 进程的名称 |
PID | 进程标识符(进程Id) |
USER | 进程所有者 |
FD | 文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 |
TYPE | 文件类型,如DIR、REG等 |
DEVICE | 指定磁盘的名称 |
SIZE | 文件的大小 |
NODE | 索引节点(文件在磁盘上的标识) |
NAME | 打开文件的确切名称 |
根据终端输出我们可以愉快地拿到进程Id:16000
3.使用nodejs内置process模块
Nodejs中,process对象是一个全局变量,因此无需require。它提供当前Node进程的相关信息。使用process.pid可以拿到当前进程的PID。
console.log(`This process is pid ${process.pid}`);
//16000
二.关闭进程
直接使用kill -9
命令强制终止进程。
语法:kill -9 <进程Id>
$ kill -9 16000
输入之后回车,没有任何反馈,表明你的操作成功了(没有消息就是好消息)。