Saya ingin menentukan proses apa yang memiliki kepemilikan file kunci. File-file kunci hanyalah sebuah file dengan nama spesifik yang telah dibuat.
Jadi, bagaimana saya bisa menentukan proses apa yang memiliki file tertentu terbuka di Linux? Lebih disukai tipe satu-liner atau solusi alat Linux tertentu akan optimal.
if [
fuser "$ file" `]; lalu keluar`ls
berikut - ia mengembalikan kode keluar 2 jika ada kesalahan (misalnya, opsi tidak valid ditentukan) atau file tidak ditemukan (dan 0 jika berhasil melaporkan informasi).Pada sebagian besar sistem Linux
lsof NAME
melakukan pekerjaan:sumber
cwd
baris (yang laporannya digunakan sebagai direktori kerja suatu proses saat ini) hanya melaporkan direktori.Memiliki file yang terbuka bukanlah kunci karena, jika setiap proses harus memeriksa apakah file tersebut dibuka terlebih dahulu dan tidak melanjutkan jika itu adalah file atau membuat / membukanya jika tidak, maka dua proses dapat memeriksa dengan baik secara bersamaan, keduanya menemukan bahwa itu tidak terbuka, maka keduanya membuat atau membukanya.
Untuk menggunakan file sebagai kunci, operasi pemeriksaan dan penguncian harus merupakan operasi tunggal yang tidak terputus. Anda dapat mencapai ini dalam sistem file Unix dengan membuat file dengan mode hanya baca dan menghapusnya untuk membuka kunci. Jika file itu ada (dan hanya baca) pembuatan file akan gagal, sehingga Anda mendapatkan check-and-lock dalam satu operasi atom.
Jika proses penguncian Anda adalah skrip shell yang akan berjalan sebagai daemon, Anda bisa mendapatkan efek ini dengan menggunakan
Ini juga menulis proses kepemilikan 'PID ke dalam file, yang memecahkan masalah Anda yang lain:umask
, pengaturan per-proses yang menetapkan izin yang membuat file baru dengan:cat /var/lock/foo
Mengenai pertanyaan spesifik "Proses mana yang membuka file ini?", Ini bisa berguna ketika Anda ingin meng-unmount sistem file tetapi tidak bisa karena beberapa proses memiliki file yang terbuka di dalamnya. Jika Anda tidak memiliki perintah-perintah itu, Anda dapat bertanya
/proc
sebagai root:ls -l /proc/*/cwd | grep '/var/lock/foo$'
atau, sebagai pengguna manusia:
ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'
sumber
Jika Anda ingin tahu deskriptor file proses mana yang ditautkan ke file Anda tanpa
lsof
ataufuser
- cari melalui/proc
:Ganti
$1
dengan nama file terbuka yang Anda cari. Anda dapat mengubah-printf
untuk apa pun yang ingin Anda lihat, atau pipaegrep -o '[0-9]+' | head -1
untuk digunakan dengan untuk info proses itu.ps -Fp <pid>
The jawaban dengan @fin adalah jawaban terbaik, jelas, tapi untuk menjawab @ komentar JoseLSegura ini , jika ini tidak tersedia, solusi di atas adalah tanggapan saya.
$ lsof <filename>
sumber
Saya menemukan bahwa menggunakan jawaban yang diterima tidak mencantumkan proses yang menggunakan direktori saya (ubuntu 14.04).
Pada akhirnya, saya menggunakan lsof (daftar file yang terbuka) dan menerima hasilnya untuk menemukan proses yang menyinggung:
sumber
lsof
adalah pilihannya-R
. misal:lsof -R [filename]