The symlink adalah kuasi universal di Linux, tetapi mereka tidak ada di tempat lain (kecuali pada Cygwin yang mengemulasi mereka). juga ada di AIX dan Solaris, tetapi mereka bukan symlinks. Portable, untuk mendapatkan informasi tentang file yang terbuka, instal ./proc/PID/fd/NUM
/proc/PID/fd/NUM
lsof
Bersatu dengan /proc/PID/fd
Di Linux, ada tautan simbolis yang agak ajaib ke file yang prosesnya dibuka dengan ID PID pada deskriptor file NUM . Tautan ini ajaib karena, misalnya, dapat digunakan untuk mengakses file bahkan jika file tersebut dihapus. Tautan juga akan melacak file melalui penggantian nama. adalah tautan simbolis ajaib yang menunjukkan ke mana PID adalah proses yang mengakses tautan./proc/PID/fd/NUM
/proc/self
/proc/PID
Fitur ini hadir di hampir semua sistem Linux. Ini disediakan oleh driver untuk sistem file proc , yang secara teknis opsional tetapi digunakan untuk banyak hal (termasuk membuat ps
pekerjaan - itu dibaca dari ) yang hampir tidak pernah ditinggalkan bahkan pada sistem embedded./proc/PID
Cygwin
Cygwin mengemulasi Linux (untuk proses Cygwin) dan ./proc/PID/fd/NUM
/proc/self
Ada entri untuk setiap deskriptor file, tetapi mereka muncul sebagai jenis yang sama dengan file yang dibuka, sehingga mereka tidak memberikan informasi tentang path file. Namun mereka melaporkan informasi yang sama seperti akan melaporkan ke proses yang memiliki file terbuka, sehingga dimungkinkan untuk menentukan sistem file mana file itu berada dan nomor inode-nya. Direktori muncul sebagai tautan simbolik, namun mereka adalah symlink ajaib yang hanya dapat diikuti, dan mengembalikan string kosong./proc/PID/fd
stat
fstat
readlink
Di bawah AIX, procfiles
perintah menampilkan beberapa informasi tentang file yang terbuka pada suatu proses. Di bawah Solaris, pfiles
perintah menampilkan beberapa informasi tentang file terbuka suatu proses. Ini tidak termasuk path ke file (pada Solaris, itu sejak Solaris 10, lihat di bawah).
Selain itu , versi Solaris modern memiliki yang berisi tautan simbolik mirip dengan symlink Linux di . The perintah menunjukkan informasi tentang proses file-file terbuka, termasuk jalur./proc/PID/fd/NUM
/proc/PID/path/NUM
/proc/PID/fd/NUM
pfiles
/proc/PID/fd
adalah file teks yang berisi satu catatan (baris) per deskriptor file yang dibuka oleh proses. Nama file tidak dilacak di sana.
/proc/PID/
adalah direktori, tetapi tidak mengandung informasi tentang deskriptor file.
Unices dengan /proc
tetapi tanpa akses langsung ke deskriptor file
(Catatan: kadang-kadang dimungkinkan untuk mendapatkan informasi tentang file yang terbuka pada suatu proses dengan mengacak-acak gambar memorinya yang dapat diakses di bawah /proc
. Saya tidak menganggap itu sebagai "akses langsung".)
Menyatukan tempat file/proc/PID
Sistem file proc sendiri dimulai dalam edisi UNIX 8, tetapi dengan struktur yang berbeda, dan pergi melalui Plan 9 dan kembali ke beberapa kesatuan. Saya pikir semua sistem operasi /proc
memiliki entri untuk setiap PID, tetapi pada banyak sistem, ini adalah file biasa, bukan direktori. Sistem berikut memiliki yang perlu dibaca :/proc/PID
ioctl
- Solaris hingga 2,5
- OSF / 1 sekarang dikenal sebagai Tru64
- IRIX (?)
- SCO (?)
MINIX 3 memiliki server procfs yang menyediakan beberapa komponen mirip Linux termasuk direktori. Namun ini tidak ada ./proc/PID/
/proc/PID/fd
FreeBSD memiliki direktori, tetapi mereka tidak memberikan informasi tentang deskriptor file terbuka. (Namun ada yang mirip dengan Linux , memberikan akses ke executable melalui tautan simbolik.)/proc/PID/
/proc/PID/file
/proc/PID/exe
Proksi FreeBSD sudah usang .
Unices tanpa /proc
- HP-UX
- OpenBSD
- NetBSD
- Mac OS X
File informasi deskriptor melalui saluran lain
The fuser
daftar perintah proses yang memiliki file terbuka yang ditentukan, atau file terbuka pada yang ditentukan mount point. Perintah ini standar (tersedia pada semua sistem yang sesuai dengan XSI , yaitu POSIX dengan Ekstensi Antarmuka Sistem X / Terbuka).
Anda tidak dapat beralih dari proses untuk mengajukan nama dengan utilitas ini.
Lsof adalah singkatan dari "daftar file terbuka". Ini adalah alat pihak ketiga , tersedia (tetapi biasanya bukan bagian dari instalasi default) untuk sebagian besar varian unix. Mendapatkan informasi tentang file terbuka sangat tergantung pada sistem, karena analisis di atas mungkin membuat Anda curiga. Pengelola lsof telah melakukan pekerjaan menggabungkan semuanya di bawah satu antarmuka.
Anda dapat membaca FAQ untuk melihat kesulitan apa yang harus dihadapi. Pada sebagian besar unices, mendapatkan informasi tentang nama file yang terbuka membutuhkan penguraian struktur data kernel. Mengutip dari FAQ 3.3 "Mengapa tidak melaporkan nama path lengkap?":
Lsof tidak dapat memperoleh komponen nama path dari cache nama kernel dari dialek berikut:
Hanya kernel Linux yang mencatat nama path lengkap dalam struktur yang dipeliharanya tentang file yang terbuka; sebagai gantinya, sebagian besar kernel mengonversi nama jalur ke perangkat dan nomor simpul doublet dan menggunakannya untuk referensi file selanjutnya setelah file dibuka.
Jika Anda perlu mem-parsing informasi dari lsof
keluaran, pastikan untuk menggunakan -F
mode (satu bidang per baris), lebih disukai -F0
mode (bidang-bidang yang dibatasi-nol). Untuk mendapatkan informasi tentang deskriptor file spesifik dari proses tertentu, gunakan -a
opsi dengan dan , misalnya .-p PID
-d NUM
lsof -a -p 123 -d 0 -F0n
/dev/fd/NUM
untuk deskriptor file dari proses saat ini
Banyak varian unix menyediakan cara bagi proses untuk mengakses file yang terbuka melalui nama file: pembukaan sama dengan panggilan . Nama-nama ini berguna ketika suatu program menginginkan nama file tetapi Anda ingin meneruskan file yang sudah terbuka (mis. Pipa atau soket); misalnya cangkang yang menerapkan proses substitusi menggunakannya di mana tersedia (menggunakan pipa bernama sementara di mana tidak tersedia)./dev/fd/NUM
dup(NUM)
/dev/fd
Di mana /dev/fd
ada, biasanya ada sinonim (selalu?) (Terkadang tautan simbolik, terkadang tautan keras, terkadang file ajaib dengan properti yang setara) /dev/stdin
= /dev/fd/0
, /dev/stdout
= /dev/fd/1
, /dev/stderr
= /dev/fd/2
.
- Di Linux,
/dev/fd
ada tautan simbolis ke /proc/self/fd
.
- Di bawah sebagian besar unix ( IRIX , OpenBSD , NetBSD , SCO, Solaris , ...), entri dalam
/dev/fd
adalah perangkat karakter. Mereka biasanya muncul apakah deskriptor file terbuka atau tidak, dan entri mungkin tidak tersedia untuk deskriptor file di atas angka tertentu.
- Di bawah FreeBSD dan OSX, filesystem fdescfs menyediakan
/dev/fd
direktori dinamis yang mengikuti deskriptor terbuka dari proses pemanggilan. Statis /dev/fd
tersedia /dev/fd
tidak terpasang.
- Di bawah OSF / 1 (Tru64),
/dev/fd
disediakan melalui fdfs .
- Tidak ada
/dev/fd
pada AIX atau HP-UX.
pfiles
perintah tersebut menunjukkan path deskriptor file. Itu mengambil informasi ini dari/proc/<pid>/path
direktori yang mungkin juga Anda sebutkan. Lihat docs.oracle.com/cd/E19253-01/817-0547/esxiq/index.htmlCara
/proc
ini diterapkan dan fitur yang disediakannya tidak standar dengan cara apa pun, lihat misalnya di sini . Menurut Wikipedia, FreeBSD sedang "dihapus"/proc
, lihat di sini untuk detailnya .Pada
/dev
,/dev/fd/
bukan merupakan bagian dari POSIX atau Spesifikasi Pengguna Tunggal (SUSv3) sementara Sistem V dan BSD mendukungnya.Tambahan:
Linux:
/dev/fd/*
adalah symlinks ke/proc/self/fd
.FreeBSD:
/dev/fd/*
disediakan melalui fdescfs.NetBSD: sama seperti FreeBSD.
OpenBSD: sama dengan FreeBSD.
Solaris: telah
/dev/fd/*
.IRIX: telah
/dev/fd/*
.Tru64 Unix:
/dev/fd/*
menurut nixdoc.net , dokumentasi Tru64 asli di HP tidak dapat dipahami (bocah, sungguh kacau! Anda tidak menemukan apa-apa!).AIX: tidak ada indikasi yang ditemukan dari dokumentasi yang tersedia untuk umum.
HP-UX: sama dengan AIX.
sumber
/dev/fd/1
pada BSD yang terhubung ke arus saya1>
? Satu hal yang biasa saya lakukan di linux adalahecho 'command' | . /dev/fd/0
- apakah hal seperti ini mungkin bekerja secara menyeluruh, menurut Anda?