GNU/Linux >> Linux Esercitazione >  >> Linux

Conteggio dei file aperti per processo

Prova questo:

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

L'ho usato per trovare i principali processi che consumano filehandler per un dato utente (nome utente) dove non hanno accesso lsof o 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

Dai un'occhiata al /proc/ file system:

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

Per fare questo per tutti i processi, usa questo:

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

Come one-liner (filtro aggiungendo | 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

Come una riga che include il nome del comando, ordinato per numero di descrittori di file in ordine decrescente (limita i risultati aggiungendo | 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

Ringraziamo @Boban per questo addendum:

Puoi reindirizzare l'output dello script sopra nel seguente script per vedere i dieci processi (e i loro nomi) che hanno il maggior numero di descrittori di file aperti:

  ...
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

Ecco un altro approccio per elencare i primi dieci processi con gli fds più aperti, probabilmente meno leggibili, quindi non li metto davanti:

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. Numero massimo di file aperti per il processo di lavoro

  2. Come impostare i file aperti max nginx?

  3. Impossibile modificare il numero massimo di file aperti per processo con sysctl

  4. Come impedire a un processo di scrivere file

  5. Troppi file aperti su Debian

Costruire contenitori a mano:lo spazio dei nomi PID

Quale processo ha Pid 0?

Come trovare il nome del processo dal suo PID

Umask corrente di un processo con <pid>

I file .pid sono affidabili per determinare se un processo è in esecuzione?

Come ottenere il pid del processo appena avviato