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
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:
Prossimo, saltiamo a una sessione terminale secondaria / nuovo ed esegui lsof
, cercando la directory di lavoro dello script, vale a dire workspace
:
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 {}
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:
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.