Debian
如何解決 Debian 11 上洩漏的文件觀察程序?
作為我工作的一部分,我使用幾個不同的 nodejs 實時伺服器,我的工具/工作流程中似乎存在某種洩漏,導致文件觀察者隨著時間的推移而積累,直到它們達到系統限制。然後我得到以下cli錯誤:
Error from chokidar (<path-to-folder>): Error: ENOSPC: System limit for number of file watchers reached, watch '<path-to-folder>/<filename>'
我發現以下命令應該返回使用的詭計觀察者的數量:
find /proc/*/fd -user "$USER" -lname anon_inode:inotify -printf '%hinfo/%f\n' 2>/dev/null | xargs cat | grep -c '^inotify'
它返回 515160,即使我似乎已經關閉了所有實時伺服器。我有兩組問題:
- 我該如何診斷?我可以獲得所有已註冊觀察者的列表、他們的觀察路徑和相應的 PID 或類似的東西嗎?
- 有沒有辦法讓我把他們都殺了?殺死所有文件觀察者是個好主意嗎?我可以只殺死我的伺服器註冊的觀察者嗎?
我正在執行 Debian 11
您提供的命令正在搜尋其中符號連結
/proc
到. 報告這些程序的命令和 PID 以及設置的監視數量也非常簡單:/proc/*/fd/``anon_inode:inotify
#!/bin/bash cd /proc for p in [0-9]* do cd $p if find fd -user "$USER" -lname anon_inode:inotify 2>/dev/null | grep -q . then IFS= read -d '' cmd < cmdline numwatch=$(cat fdinfo/* | grep -c '^inotify') [[ $numwatch -ge 1 ]] && printf '%s\n PID %s\t %s watches\n' "$cmd" "$p" "$numwatch" fi cd .. done
事實上,我發現 oligofren 已經編寫了一個類似的腳本inotify-consumers作為 答案,它的輸出格式更好。
然而,找到被監視的實際路徑變得更加複雜。您只有來自 的 inode
/proc/*/fdinfo
,因此您必須搜尋整個文件系統以找到映射到 inode 的路徑。這是一項昂貴的操作。有一個 C++ 程序inotify-info可以做到這一點;也從這裡的答案中找到。我只是在我的機器上建構它並且它可以工作。不帶參數執行,它只列出每個程序的監視數,與 inotify-consumers 腳本相同。給定一個特定的命令名稱或 PID,它還會搜尋該程序監視的 inode 的路徑。
殺死所有觀察者可能不是一個好主意,但在查看哪些程序正在使用大量觀察者之後,您可以做出明智的選擇。