I collegamenti simbolici sono quasi universali su Linux, ma non esistono altrove (tranne su Cygwin che li emula). esistono anche su AIX e Solaris, ma non sono collegamenti simbolici. Portabilmente, per ottenere informazioni sui file aperti, installa ./proc/PID/fd/NUM
/proc/PID/fd/NUM
lsof
Unices with /proc/PID/fd
Sotto Linux, c'è un collegamento simbolico leggermente magico al file che il processo con ID PID ha aperto sul descrittore di file NUM . Questo collegamento è magico in quanto, ad esempio, può essere utilizzato per accedere al file anche se il file viene rimosso. Il collegamento seguirà anche il file attraverso i nomi. è un collegamento simbolico magico che indica dove PID è il processo che accede al collegamento./proc/PID/fd/NUM
/proc/self
/proc/PID
Questa funzione è presente praticamente su tutti i sistemi Linux. È fornito dal driver per il filesystem proc , che è tecnicamente opzionale ma usato per così tante cose (incluso fare il ps
lavoro - legge da ) che non viene quasi mai escluso nemmeno su sistemi embedded./proc/PID
Cygwin
Cygwin emula Linux (per i processi Cygwin) e ./proc/PID/fd/NUM
/proc/self
Solaris (dalla versione 2.6), AIX
Esistono voci per ciascun descrittore di file, ma appaiono dello stesso tipo del file aperto, quindi non forniscono informazioni sul percorso del file. Tuttavia, riportano le stesse informazioni che riferirebbero al processo che ha il file aperto, quindi è possibile determinare su quale filesystem si trova il file e il suo numero di inode. Le directory appaiono come collegamenti simbolici, tuttavia sono collegamenti simbolici magici che possono essere solo seguiti e restituiscono una stringa vuota./proc/PID/fd
stat
fstat
readlink
In AIX, il procfiles
comando visualizza alcune informazioni sui file aperti di un processo. In Solaris, il pfiles
comando visualizza alcune informazioni sui file aperti di un processo. Questo non include il percorso del file (su Solaris, lo fa da Solaris 10, vedere di seguito).
Inoltre , nelle moderne versioni di Solaris sono presenti collegamenti simbolici simili ai collegamenti simbolici di Linux in . Il comando mostra informazioni sui file aperti di un processo, inclusi i percorsi./proc/PID/fd/NUM
/proc/PID/path/NUM
/proc/PID/fd/NUM
pfiles
/proc/PID/fd
è un file di testo che contiene un record (riga) per descrittore di file aperto dal processo. Il nome del file non viene tracciato lì.
/proc/PID/
è una directory, ma non contiene alcuna informazione sui descrittori di file.
Unices /proc
senza accesso diretto ai descrittori di file
(Nota: a volte è possibile ottenere informazioni sui file aperti di un processo sfogliando la sua immagine di memoria che è accessibile sotto /proc
. Non lo considero come "accesso diretto".)
Unices dove si trova un file/proc/PID
Lo stesso filesystem proc è iniziato con l' UNIX ottava edizione, ma con una struttura diversa, ed è passato attraverso il Piano 9 e poi è tornato ad alcuni Unix. Penso che tutti i sistemi operativi con un /proc
hanno una voce per ogni PID, ma su molti sistemi, è un file normale, non una directory. I seguenti sistemi hanno un che deve essere letto con :/proc/PID
ioctl
- Solaris fino a 2,5
- OSF / 1 ora noto come Tru64
- IRIX (?)
- SCO (?)
MINIX 3 ha un server procfs che fornisce diversi componenti simili a Linux, incluse le directory. Tuttavia, questo non esiste ./proc/PID/
/proc/PID/fd
FreeBSD ha delle directory, ma non forniscono informazioni sui descrittori di file aperti. (Esiste tuttavia un metodo simile a quello di Linux , che consente l'accesso all'eseguibile tramite un collegamento simbolico.)/proc/PID/
/proc/PID/file
/proc/PID/exe
I procfs di FreeBSD sono deprecati .
Unices senza /proc
- HP-UX
- OpenBSD
- NetBSD
- Mac OS X
Informazioni sul descrittore di file tramite altri canali
Il fuser
comando elenca i processi che hanno un file specificato aperto o un file aperto sul punto di montaggio specificato. Questo comando è standard (disponibile su tutti i sistemi conformi a XSI , ovvero POSIX con l'estensione dell'interfaccia di sistema X / Open).
Non è possibile passare da un processo a nomi di file con questa utility.
Lsof significa "elenco file aperti". È uno strumento di terze parti , disponibile (ma di solito non fa parte dell'installazione predefinita) per la maggior parte delle varianti di unix. Ottenere informazioni sui file aperti dipende molto dal sistema, poiché l'analisi sopra potrebbe averti fatto sospettare. Il manutentore lsof ha fatto il lavoro di combinare tutto sotto un'unica interfaccia.
Puoi leggere le FAQ per vedere quali tipi di difficoltà lsof deve affrontare. Sulla maggior parte degli unices, ottenere informazioni sui nomi dei file aperti richiede l'analisi delle strutture di dati del kernel. Citando dalla domanda frequente 3.3 "Perché lsof non riporta i nomi dei percorsi completi?":
Lsof non è in grado di ottenere componenti del nome percorso dalle cache dei nomi kernel dei seguenti dialetti:
Solo il kernel Linux registra i nomi dei percorsi completi nelle strutture che gestisce sui file aperti; invece, la maggior parte dei kernel converte i nomi dei percorsi in doppiette di dispositivi e numeri di nodo e li usa per riferimenti di file successivi dopo l'apertura dei file.
Se è necessario analizzare le informazioni lsof
dall'output, assicurarsi di utilizzare la -F
modalità (un campo per riga), preferibilmente la -F0
modalità (campi delimitati da null). Per ottenere informazioni su un descrittore di file specifico di un processo specifico, utilizzare l' -a
opzione con e , ad es .-p PID
-d NUM
lsof -a -p 123 -d 0 -F0n
/dev/fd/NUM
per i descrittori di file del processo corrente
Molte varianti unix consentono a un processo di accedere ai suoi file aperti tramite un nome file: l'apertura è equivalente alla chiamata . Questi nomi sono utili quando un programma desidera un nome di file ma si desidera passare un file già aperto (ad esempio una pipe o un socket); ad esempio le shell che implementano la sostituzione di processo le usano dove disponibili (usando una pipe denominata temporanea dove non è disponibile)./dev/fd/NUM
dup(NUM)
/dev/fd
Dove /dev/fd
esiste, di solito ci sono anche (sempre?) Sinonimi (a volte collegamenti simbolici, a volte collegamenti rigidi, a volte file magici con proprietà equivalenti) /dev/stdin
= /dev/fd/0
, /dev/stdout
= /dev/fd/1
, /dev/stderr
= /dev/fd/2
.
- Sotto Linux,
/dev/fd
c'è un collegamento simbolico a /proc/self/fd
.
- Nella maggior parte dei computer ( IRIX , OpenBSD , NetBSD , SCO, Solaris , ...), le voci in
/dev/fd
sono dispositivi a caratteri. Di solito vengono visualizzati se il descrittore di file è aperto o meno e le voci potrebbero non essere disponibili per i descrittori di file superiori a un determinato numero.
- Sotto FreeBSD e OSX, il filesystem fdescfs fornisce una
/dev/fd
directory dinamica che segue i descrittori aperti del processo di chiamata. Uno statico /dev/fd
è disponibile /dev/fd
non è montato.
- In OSF / 1 (Tru64),
/dev/fd
viene fornito tramite fdfs .
- Non è disponibile
/dev/fd
su AIX o HP-UX.
pfiles
comando mostra il percorso dei descrittori di file. Recupera queste informazioni dalla/proc/<pid>/path
directory che potresti anche menzionare. Vedi docs.oracle.com/cd/E19253-01/817-0547/esxiq/index.html