GNU/Linux >> Znalost Linux >  >> Linux

Počítání otevřených souborů na proces

Zkuste toto:

ps aux | sed 1d | awk '{print "fd_count=$(lsof -p " $2 " | wc -l) && echo " $2 " $fd_count"}' | xargs -I {} bash -c {}

Použil jsem to k nalezení procesů náročných na zpracování souborů pro daného uživatele (uživatelské jméno), kde nemají přístup lsof nebo root:

for pid in `ps -o pid -u username` ; do echo "$(ls /proc/$pid/fd/ 2>/dev/null | wc -l ) for PID: $pid" ; done  | sort -n | tail

Podívejte se na /proc/ souborový systém:

ls /proc/$pid/fd/ | wc -l

Chcete-li to provést pro všechny procesy, použijte toto:

cd /proc
for pid in [0-9]*
do
    echo "PID = $pid with $(ls /proc/$pid/fd/ | wc -l) file descriptors"
done

Jako jednořádkový (filtrujte připojením | grep -v "0 FDs" ):

for pid in /proc/[0-9]*; do printf "PID %6d has %4d FDs\n" $(basename $pid) $(ls $pid/fd | wc -l); done

Jako jednořádkový řádek obsahující název příkazu, seřazený podle počtu deskriptorů souboru v sestupném pořadí (omezte výsledky připojením | head -10 ):

for pid in /proc/[0-9]*; do p=$(basename $pid); printf "%4d FDs for PID %6d; command=%s\n" $(ls $pid/fd | wc -l) $p "$(ps -p $p -o comm=)"; done | sort -nr

Poděkování @Boban za tento dodatek:

Výstup výše uvedeného skriptu můžete převést do následujícího skriptu, abyste viděli deset procesů (a jejich názvy), které mají nejvíce otevřených deskriptorů souborů:

  ...
done | sort -rn -k5 | head | while read -r _ _ pid _ fdcount _
do
  command=$(ps -o cmd -p "$pid" -hc)
  printf "pid = %5d with %4d fds: %s\n" "$pid" "$fdcount" "$command"
done

Zde je další přístup k seznamu deseti nejlepších procesů s nejotevřenějšími fds, pravděpodobně méně čitelný, takže to neuvádím dopředu:

find /proc -maxdepth 1 -type d -name '[0-9]*' \
     -exec bash -c "ls {}/fd/ | wc -l | tr '\n' ' '" \; \
     -printf "fds (PID = %P), command: " \
     -exec bash -c "tr '\0' ' ' < {}/cmdline" \; \
     -exec echo \; | sort -rn | head

Linux
  1. Který proces má Pid 0?

  2. Jak identifikovat proces, který nemá PID?

  3. Maximální počet otevřených souborů pro pracovní proces

  1. Nelze změnit maximální počet otevřených souborů na proces pomocí sysctl

  2. Jak zabránit procesu v zápisu souborů

  3. Aktuální umask procesu s <pid>

  1. Jak zvýšit limit počtu otevřených souborů v Linuxu

  2. Příliš mnoho otevřených souborů v Debianu

  3. Proměnné prostředí běžícího procesu na Unixu?