unix下的文件操縱
unix/linux 下的命令太多了,花時間系統去學肯定十分枯燥,平時有需求用到某些命令的時候就會將這個命令所有的功能都看看,這次是為了關掉某個端口的進程,學習了下 lsof 和 kill 命令。
在 sublime 中配置了開啟 node 的快捷方式,Command + B可以直接執行正在編輯的 js 文件。多次由于操作不當,報錯:
Error: listen EADDRINUSE at exports._errnoException (util.js:746:11) at Server._listen2 (net.js:1156:14) at listen (net.js:1182:10) at Server.listen (net.js:1267:5) ...
意思就是端口被占用EADDRINUSE,即 “Error: Address in use”,這里為啥喚作 address 而不是 port 被占用,還是有說法的。
在 linux/unix 下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網絡連接和硬件。如 TCP/UDP 套接字,應用程序都會在系統目錄下為期分配一個文件描述符,這個描述符就是程序和系統交互的接口。
lsof 命令
lsof是 *nix 下常用的一個命令,全稱為 “list open file”,列舉被打開的文件描述符的相關信息,包括:
- -u用戶,如 root
- -c進程名,如 chrome
- -ggid
- -ppid
- -aand 的意思,滿足多個條件過濾
- -i端口號
還有幾個就不列舉了,對一般用戶來說并不常用。一次命令的執行,程序會吐出這些信息:
? blogsys ? lsof -i :4001 COMMAND PID USER FD TYPE NODE NAME Google 57881 barretlee 113u IPv4 TCP localhost:52445->localhost:newoak (ESTABLISHED) node 68004 barretlee 11u IPv6 TCP *:newoak (LISTEN) node 68004 barretlee 18u IPv6 TCP localhost:newoak->localhost:52445 (ESTABLISHED)
中間還有一個 DEVICE 和 SIZE,被我刪掉了。從上面可以看到包含如下信息:
- COMMAND 對應我們上面提到的 -c
- PID 對應 -p
- USER 對應 -u
- NAME 被打開文件的名字
- FD、TYPE、NODE 就不細說了,可以看下面兩篇參考文章
通過前面的參數,可以篩選被打開的文件。
關閉開啟的端口
通過 lsof 的端口查找參數找到 pid 或者 command:
lsof -i :4001
比如我們找到的 command 是 node, pid 為 73220,則可以通過下面的方式關閉端口:
kill -p 73220 pkill node
另外還有 killall、xkill 等命令,可以閱讀 4 Ways to Kill a Process – kill, killall, pkill, xkil
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!