unix下的文件操縱

jopen 9年前發布 | 53K 次閱讀 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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!