W dowiązania są quasi-uniwersalny na Linuksie, ale one nie istnieją nigdzie indziej (z wyjątkiem Cygwin które je emuluje). istnieją również w systemach AIX i Solaris, ale nie są dowiązaniami symbolicznymi. Przenośnie, aby uzyskać informacje o otwartych plikach, zainstaluj ./proc/PID/fd/NUM
/proc/PID/fd/NUM
lsof
Unices z /proc/PID/fd
Pod Linuksem jest nieco magicznym dowiązaniem symbolicznym do pliku, który proces o identyfikatorze PID otworzył na deskryptorze pliku NUM . Ten link jest magiczny, ponieważ na przykład można go użyć do uzyskania dostępu do pliku, nawet jeśli plik zostanie usunięty. Link będzie również śledził plik poprzez zmiany nazw. to magiczny symboliczny link, który wskazuje, gdzie PID to proces, który uzyskuje dostęp do łącza./proc/PID/fd/NUM
/proc/self
/proc/PID
Ta funkcja jest obecna na praktycznie wszystkich systemach Linux. Jest dostarczany przez sterownik dla systemu plików proc , który jest technicznie opcjonalny, ale używany do wielu rzeczy (w tym do wykonywania ps
pracy - czyta z ), że prawie nigdy nie jest pomijany nawet w systemach osadzonych./proc/PID
Cygwin
Cygwin emuluje Linuksa (dla procesów Cygwin) i ./proc/PID/fd/NUM
/proc/self
Dla każdego deskryptora pliku istnieją wpisy, ale są one tego samego typu co otwarty plik, więc nie zawierają informacji o ścieżce pliku. Zgłaszają jednak te same informacje, które zgłosiłyby procesowi, w którym plik jest otwarty, więc można ustalić, w którym systemie plików znajduje się plik i jego numer i-węzła. Katalogi pojawiają się jako dowiązania symboliczne, ale są to magiczne dowiązania symboliczne, których można tylko śledzić, i zwraca pusty ciąg./proc/PID/fd
stat
fstat
readlink
W systemie AIX procfiles
polecenie wyświetla niektóre informacje o otwartych plikach procesu. W systemie Solaris pfiles
polecenie wyświetla niektóre informacje o otwartych plikach procesu. Nie obejmuje to ścieżki do pliku (w systemie Solaris robi to od wersji Solaris 10, patrz poniżej).
Oprócz tego nowoczesne wersje Solaris mają takie, które zawierają dowiązania symboliczne podobne do dowiązań symbolicznych Linuksa . Podaje komunikat informacji o procesie jest otwarte pliki, w tym ścieżek./proc/PID/fd/NUM
/proc/PID/path/NUM
/proc/PID/fd/NUM
pfiles
/proc/PID/fd
to plik tekstowy, który zawiera jeden rekord (wiersz) na deskryptor pliku otwarty przez proces. Nazwa pliku nie jest tam śledzona.
/proc/PID/
jest katalogiem, ale nie zawiera żadnych informacji o deskryptorach plików.
Unices /proc
bez bezpośredniego dostępu do deskryptorów plików
(Uwaga: czasami można uzyskać informacje o otwartych plikach procesu, przeglądając obraz pamięci, który jest dostępny pod /proc
. Nie liczę tego jako „bezpośredniego dostępu”).
Unices, gdzie jest plik/proc/PID
Sam system plików proc zaczął się w UNIX 8 edycja, ale z inną strukturą, i przeszedł przez Plan 9 i wrócił do niektórych jednorożców. Myślę, że we wszystkich systemach operacyjnych z /proc
wpisem dla każdego PID, ale w wielu systemach jest to zwykły plik, a nie katalog. Następujące systemy muszą być czytane za pomocą :/proc/PID
ioctl
- Solaris do 2.5
- OSF / 1 znany teraz jako Tru64
- IRIX (?)
- SCO (?)
MINIX 3 ma serwer procfs, który udostępnia kilka komponentów podobnych do Linuksa, w tym katalogów. Jednak nie ma nie ./proc/PID/
/proc/PID/fd
FreeBSD ma katalogi, ale nie zawierają informacji o otwartych deskryptorach plików. (Jest jednak podobny do Linuksa , dający dostęp do pliku wykonywalnego poprzez dowiązanie symboliczne)./proc/PID/
/proc/PID/file
/proc/PID/exe
Procesy FreeBSD są przestarzałe .
Unices bez /proc
- HP-UX
- OpenBSD
- NetBSD
- Mac OS X
Informacje o deskryptorze pliku innymi kanałami
Do fuser
listy poleceń procesy, które mają określoną otwartego pliku lub plik otwarty na określony punkt montowania. To polecenie jest standardowe (dostępne we wszystkich systemach zgodnych z XSI , tj. POSIX z rozszerzeniem X / Open System Interface).
Za pomocą tego narzędzia nie można przejść od procesu do nazw plików.
Lsof oznacza „listę otwartych plików”. Jest to narzędzie innej firmy , dostępne (ale zazwyczaj nie jest częścią domyślnej instalacji) dla większości wariantów Uniksa. Uzyskiwanie informacji o otwartych plikach jest bardzo zależne od systemu, ponieważ powyższa analiza mogła wzbudzić podejrzenia. Konserwator lsof wykonał pracę polegającą na połączeniu tego wszystkiego w jednym interfejsie.
Możesz przeczytać FAQ, aby zobaczyć, z jakimi trudnościami musi się zmierzyć lsof. W większości jednorożców uzyskanie informacji o nazwach otwartych plików wymaga analizy struktur danych jądra. Cytując z FAQ 3.3 „Dlaczego lsof nie zgłasza pełnych nazw ścieżek?”:
Lsof nie może uzyskać komponentów nazwy ścieżki z pamięci podręcznej nazw jądra następujących dialektów:
Tylko jądro Linux zapisuje pełne nazwy ścieżek w strukturach, które utrzymuje o otwartych plikach; zamiast tego większość jąder konwertuje nazwy ścieżek na dublety urządzeń i numerów węzłów i wykorzystuje je do późniejszych odwołań do plików po otwarciu plików.
Jeśli chcesz przeanalizować informacje z lsof
wyników, pamiętaj o użyciu -F
trybu (jedno pole na linię), najlepiej -F0
trybu (pola rozdzielane zerami). Aby uzyskać informacje o określonym deskryptorze pliku określonego procesu, użyj -a
opcji z i np .-p PID
-d NUM
lsof -a -p 123 -d 0 -F0n
/dev/fd/NUM
dla deskryptorów plików bieżącego procesu
Wiele wariantów Uniksa zapewnia procesowi dostęp do otwartych plików za pomocą nazwy pliku: otwarcie jest równoważne wywołaniu . Te nazwy są przydatne, gdy program chce nazwy pliku, ale chcesz przekazać plik już otwarty (np. Potok lub gniazdo); na przykład powłoki, które implementują podstawianie procesów, używają ich tam, gdzie są dostępne (używając tymczasowej nazwanej potoki, gdy jest niedostępna)./dev/fd/NUM
dup(NUM)
/dev/fd
Tam /dev/fd
, gdzie istnieje, zwykle istnieją też (zawsze?) Synonimy (czasem linki symboliczne, czasem twarde linki, czasem magiczne pliki o równoważnych właściwościach) /dev/stdin
= /dev/fd/0
, /dev/stdout
= /dev/fd/1
, /dev/stderr
= /dev/fd/2
.
- Pod Linuksem
/dev/fd
jest dowiązaniem symbolicznym /proc/self/fd
.
- W większości jednorożców ( IRIX , OpenBSD , NetBSD , SCO, Solaris ,…) wpisy w
/dev/fd
to urządzenia znakowe. Zwykle pojawiają się, czy deskryptor pliku jest otwarty, czy nie, a wpisy dla deskryptorów plików powyżej określonej liczby mogą być niedostępne.
- W systemach FreeBSD i OSX system plików fdescfs zapewnia
/dev/fd
katalog dynamiczny zgodny z otwartymi deskryptorami procesu wywołującego. Statyczny /dev/fd
jest dostępny /dev/fd
nie jest zamontowany.
- Pod OSF / 1 (Tru64)
/dev/fd
jest dostarczany przez fdfs .
- Nie ma go
/dev/fd
w systemie AIX ani HP-UX.
pfiles
polecenie wyświetla ścieżkę deskryptorów plików. Pobiera te informacje z/proc/<pid>/path
katalogu, o którym możesz również wspomnieć. Zobacz docs.oracle.com/cd/E19253-01/817-0547/esxiq/index.htmlSposób
/proc
jest zaimplementowany, a funkcje, które zapewnia, nie są w żaden sposób ustandaryzowane, patrz na przykład tutaj . Według Wikipedii FreeBSD „wycofuje się”/proc
, szczegóły tutaj .Na dzień
/dev
,/dev/fd/
nie jest częścią POSIX lub Single User Specyfikacja (SUSv3), podczas gdy System V i BSD ją wspierać.Uzupełnienie:
Linux:
/dev/fd/*
są dowiązaniami symbolicznymi do/proc/self/fd
.FreeBSD:
/dev/fd/*
jest dostarczany przez fdescfs.NetBSD: to samo co FreeBSD.
OpenBSD: to samo co FreeBSD.
Solaris: ma
/dev/fd/*
.IRIX: ma
/dev/fd/*
.Tru64 Unix:
/dev/fd/*
według nixdoc.net oryginalna dokumentacja Tru64 w HP jest nieodgadniona (chłopie, co za bałagan! Nic nie znajdziesz!).AIX: nie znaleziono wskazań w publicznie dostępnej dokumentacji.
HP-UX: taki sam jak AIX.
źródło
/dev/fd/1
na BSD, który prowadzi do mojego obecnego1>
? Jedną rzeczą, którą często robię w Linuksie jestecho 'command' | . /dev/fd/0
- czy sądzisz, że tego rodzaju rzeczy będą działać ogólnie , prawda?