Come usare lsof in Linux (con un esempio pratico)

Contenuti

Come usare lsof su Linux con un esempio pratico

Ti sei mai chiesto come scoprire quali file sono aperti e in uso sul tuo sistema oggi?? Il comando lsof di Linux elenca i file aperti e fornisce molte informazioni aggiuntive. Impara come usare lsof con questi esempi pratici.

Che cos'è lsof?

Disponibile nativamente su qualsiasi sistema operativo Linux, il lsof Il comando fornisce un elenco di file aperti. Nonostante questo, l'output può essere un po' criptico e lungo, soprattutto quando vengono utilizzate molte applicazioni su un dato sistema. Diamo un'occhiata alle basi lsof produzione. Nosotros correríamos lsof come radice.

Para iniciar sesión como root, puede abrir una ventana de terminal y escribir un comando como sudo su oh su para recibir un mensaje de autenticación de root. In alternativa, può eseguire sudo lsof. Tenga en cuenta que aunque puede correr lsof como usuario normal no root además, puede hallar que la salida está incompleta.

Esempio: di base lsof Producción

sudo su
lsof | head -n10

Inicio de la salida lsof y los nombres de las columnas lsof en una terminal Bash

Aquí empezamos el lsof herramienta usando el lsof comando, y capturó las primeras diez líneas de la salida usando una tubería (|) per inviare le informazioni prodotte da lsof ad un liceo head -n10 comando che cattura solo le prime dieci righe (diretto).

il lsof Il comando elenca più colonne. Per prima cosa vediamo il COMANDO colonna che elenca il binario che contiene il file aperto / blocco file aperto. Prossimo, vediamo la colonna di identificazione della procedura. PID che è estremamente utile quando si tenta di eseguire il debug di vari problemi dell'applicazione, compresi i blocchi di file detenuti in modo errato. Nella prossima sezione vedremo un esempio di come possiamo usare lsof in combinazione con kill finire (distruttivamente) app che hanno blocchi di file non validi.

Se è compatibile con il tuo sistema operativo, il TEMPO La colonna può aiutarti a capire se una determinata riga è una procedura o un'attività. Se l'output è vuoto, come puoi vedere nel nostro esempio (in esecuzione su Linux Mint, un sistema operativo che supporta il TEMPO uscita della colonna), la linea / dato il comando è una procedura, niente compiti. e, come esempio, avvia un'applicazione calcolatrice sul tuo sistema operativo, In altre parole, un compito, questa colonna sarà popolata con un numero di identificazione dell'attività / ciao.

il TASKCMD La colonna contiene il nome del comando dell'attività. Ancora, visibile solo se la riga indicata è un'attività e non una procedura. Questo è regolarmente lo stesso del comando / procedura mostrata nella prima COMANDO colonna, benché, come esempio, Linux consente a un'attività di modificare il nome del comando, quindi potrebbe contenere ulteriori informazioni sull'attività. il NOME UTENTE La colonna elenca l'utente che ha avviato la procedura / compito.

Poi abbiamo una colonna importante FD (Descrittore di file) cosa puoi elencare? Numero descrittore file o una stringa di testo specifica che indica che tipo di descrittore di file è. Come esempio, se tu vedi cwd in questa colonna, significa directory di lavoro corrente e indica che la procedura o l'attività specificata ha un blocco aperto sulla directory di lavoro corrente e che la directory di lavoro è elencata sotto il NOME colonna.

Per un elenco completo di tutte le possibili FD Catene, tipo man lsof al prompt dei comandi seguito digitando / FD (insieme a 3 spazi dopo la barra e prima di FD) una volta dentro il manuale, e poi premendo ENTRARE DENTRO per trovare la sezione FD.

Quando si tratta di file normali, può pensare al FD colonna come contatore, o un contatore ID univoco, a partire da 0 e aumentando fino al numero totale di file aperti regolari sul sistema, con il numero massimo di file aperti definito dal ulimit -n regolazione, eccetera.

Quando si guardano i file normali, il FD la spina, come esempio, si mostrerà 102u oh 13w. Questi due esempi rappresentano rispettivamente il 102esimo file aperto nel sistema, in modalità di accesso misto in lettura / scrivere, come indicato dal u indicatore / etichetta e il 13 Apri file sul sistema, solo in modalità di accesso in scrittura.

il SCRIVI la colonna è piuttosto autoesplicativa; indica se mantenere un file normale o un blocco di directory aperto. Ci sono molti altri tag che potrebbero essere visualizzati qui, e una ricerca per / TYPE Su man lsof (come spiegato in precedenza) fornirà un elenco completo.

il DISPOSITIVO La colonna elenca generalmente i numeri dei dispositivi, separati da virgole, per la maggior parte dei tipi di file. il SIZE/OFF la colonna è la dimensione del file, o l'offset del file in byte, e il NODO La colonna mostra comunemente il nodo del file o il numero di inode del file NFS dei file locali. Puoi anche elencare, come esempio TCP oh UDP quando il lucchetto dato è una connessione Internet aperta.

Esempio: utilizzo lsof insieme a uccidere

Usando lsof in combinazione con grep, awk e kill si può ricercare un file specifico su un dato sistema e successivamente terminare la procedura (usando il PID, o identificatore di procedura, precedentemente descritto).

Si prega di notare che questo dovrebbe essere fatto solo in situazioni in cui ha senso farlo. Come esempio, puoi avere uno script bash multi-thread che avvia molti sottolivelli diversi in cui ognuno si aggrappa a un determinato file, e aspettati che uno dei fili si blocchi. Conoscere il nome del file aperto della procedura di sospensione, ma non sa qual è il PID per quella procedura / i compiti sono.

In una situazione del genere, possiamo eseguire i seguenti comandi:

sudo su
lsof | grep 'qualche_descrittore_file' | imbarazzante '{Stampa $2}' | xargs -I{} uccisione -9 {}

Pongamos esto en un ejemplo práctico. Supongamos que hemos creado el siguiente script test.sh Su /tmp:

rm -Rf workspace
mkdir workspace
cd workspace
sleep 36000

Este script, cuando se ejecuta, creará un directorio llamado workspace, cambie los directorios a él con cd e successivamente sleep durante 10 ore. Aunque a primera vista esto no parece abrir ningún archivo, recuerde la cwd Discutido antes; el script tiene un directorio de trabajo actual en uso, vale a dire /tmp/workspace!

Veamos cómo funciona esto en la práctica. Primo, noi definiamo (usando su editor de texto favorito como vi) y posteriormente inicie el script en una sesión de terminal:

Esecuzione di uno script test.sh che conterrà le directory aperte come elencato di seguito da lsof

Prossimo, saltiamo a una sessione terminale secondaria / nuovo ed esegui lsof, cercando la directory di lavoro dello script, vale a dire workspace:

lsof con un grep per il testo corrispondente è un ottimo modo per trovare l'output dettagliato di lsof

Come possiamo vedere, lsof è in grado di trovare non solo il nostro script di prova test.sh che ha un cwd ingaggiare /tmp/workspace, ma vediamo anche che sleep, iniziato dall'interno dello script, avere un cwd apri il descrittore di file (o meglio directory) nella stessa directory.

Possiamo anche vedere entrambi i PID Per lui test.sh script così come per il sleep comando. Supponiamo per un secondo che il nostro test.sh la sceneggiatura era sospesa e volevamo assolutamente farla finita in modo distruttivo, In altre parole, insieme a kill -9 che è il modo più distruttivo per concludere una procedura senza alcun livello di chiusura ordinata, e questo si basa su qualsiasi file aperto (o nel nostro caso, directory aperte) che conteneva lo script. Emettiamo il seguente comando dal terminale secondario:

lsof | grep "spazio di lavoro" | imbarazzante '{Stampa $2}' | xargs -I{} uccisione -9 {}

Uccidi un processo usando kill -9 basato su una ricerca lsof usando grep

Questo comando prenderà l'output precedente e lo analizzerà ulteriormente. il awk '{print $2}' Basta campionare la colonna secondaria (ID di procedura) e il xargs Il comando passerà questa seconda colonna a kill -9 (il {} nel comando sarà sostituito da qualsiasi input xargs riceve).

Potremmo anche anticiparlo lsof ha una riga di intestazione contenente PID e questo testo sarà passato anche per uccidere. Anche se non creerà un ostacolo, un comando generale migliore avrebbe letto lsof | grep "workspace" | grep -v "PID" | awk '{print $2}' | xargs -I{} kill -9 {}, o qualche altro modo per filtrare completamente la prima riga.

Il risultato nella nostra prima sessione del terminale principale è che il nostro script viene rimosso istantaneamente:

Lo script test.sh ha rimosso l'output come risultato della rimozione eseguita nell'altro terminale

Per maggiori informazioni su xargs, puoi leggere sull'uso di xargs in combinazione con bash -c per creare comandi complessi. Per la programmazione multiprocesso Bash, vedere Come utilizzare l'elaborazione multithread negli script bash.

Fine

In questo post esploriamo l'uso di lsof, il comando list open files e quali informazioni rappresenta ciascuna delle colonne nel suo output predefinito. Analizziamo anche un caso d'uso pratico in cui utilizziamo lsof in combinazione con grep, awk e kill per trovare un file particolare (o nel nostro caso una directory) che viene tenuto aperto da uno script e successivamente termina quello script chiudendo così la directory aperta.

Se ti è piaciuto leggere questo post, dai un'occhiata ai nostri reclami, errori e crash: qual è la differenza? inviare.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.