2012-09-17 15 views
11

Ho 30 istanze di un processo in esecuzione su un server e voglio registrare i file aperti per ogni processo per l'analisi.lsof dovrebbe fornire tutti i file aperti per una serie di pids

Ho eseguito il seguente comando:

* ps auwwx | grep PROG_NAME | awk '{print $2}' | xargs lsof -p | less 

It denunce che, "lsof: errore di stato on: No such file or directory"

Tuttavia, se corro lsof -p <pid> mi la dà elenco di file aperti per quel processo. Come posso ottenere un elenco di tutti i file aperti per tutte le 30 istanze del processo su una macchina FreeBSD.

Inoltre, non desidero elencare le librerie condivise. Se faccio -d "^txt" non mostra altri file db che voglio mostrare. C'è un altro modo per annullare i file .so?

+0

FYI per Internet passante: volevo risolvere un problema simile - contando il numero di file aperti per processo, in particolare Java. L'ho fatto in questo modo: 'pgrep java | xargs -I {} bash -c 'printf {}; lsof -p {} | wc -l'' –

risposta

14

L'opzione lsof -p richiede un elenco separato da virgola di PID. Il modo in cui stai usando xargs passerà i pids come argomenti separati che portano alcuni ad essere interpretati come nomi di file.

Prova lsof -p $(your grep | tr '\012' ,) che sta per avere una virgola finale, non sono sicuro se lsof si cura, ma si potrebbe sed fuori se necessario.

5

È possibile utilizzare xargs -L1 lsof -p per eseguire lsof una volta per pid.

Ancora meglio: usare lsof -c elencare tutti i file aperti dai comandi che corrispondono a un modello specifico:

lsof -c bas # list all processes with commands starting with 'bas' 
lsof -c '/ash$/x' # list all commands ending with 'ash' (regexp syntax)