Debian

如何解決 Debian 11 上洩漏的文件觀察程序?

  • March 29, 2022

作為我工作的一部分,我使用幾個不同的 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,即使我似乎已經關閉了所有實時伺服器。我有兩組問題:

  1. 我該如何診斷?我可以獲得所有已註冊觀察者的列表、他們的觀察路徑和相應的 PID 或類似的東西嗎?
  2. 有沒有辦法讓我把他們都殺了?殺死所有文件觀察者是個好主意嗎?我可以只殺死我的伺服器註冊的觀察者嗎?

我正在執行 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 的路徑。

殺死所有觀察者可能不是一個好主意,但在查看哪些程序正在使用大量觀察者之後,您可以做出明智的選擇。

引用自:https://unix.stackexchange.com/questions/691897