Pada sebagian besar sistem Linux lsof NAME
melakukan pekerjaan:
[email protected]:~$ lsof /home/fin
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 21310 fin cwd DIR 8,1 4096 5054467 /home/fin
lsof 21320 fin cwd DIR 8,1 4096 5054467 /home/fin
lsof 21321 fin cwd DIR 8,1 4096 5054467 /home/fin
[email protected]:~$
Anda juga dapat menggunakan fuser
untuk ini:
~> less .vimrc
# put in background
~> fuser .vimrc
.vimrc: 28135
~> ps 28135
PID TTY STAT TIME COMMAND
28135 pts/36 T 0:00 less .vimrc
Membuka file bukanlah kunci karena, jika setiap proses harus memeriksa apakah file dibuka terlebih dahulu dan tidak melanjutkan jika dibuka atau membuat/membukanya jika tidak, maka dua proses dapat memeriksa dengan baik secara bersamaan, keduanya menemukan bahwa itu tidak terbuka, buat atau buka.
Untuk menggunakan file sebagai kunci, operasi check-and-lock harus merupakan operasi tunggal yang tidak dapat diinterupsi. Anda dapat mencapai ini dalam sistem file Unix dengan membuat file dengan mode read-only dan menghapusnya untuk membuka kunci. Jika file tersebut ada (dan hanya dapat dibaca), pembuatan file akan gagal, sehingga Anda mendapatkan check-and-lock dalam satu operasi atomik.
Jika proses penguncian Anda adalah skrip shell yang akan dijalankan sebagai daemon, Anda bisa mendapatkan efek ini dengan menggunakan umask
, pengaturan per proses yang menyetel izin untuk membuat file baru:
oldumask=$(umask) umask 222 # create files unwritable to owner too if echo $$ > /var/lock/foo then : locking succeeded else : locking failed fi umask $oldumaskIni juga menulis PID proses kepemilikan ke dalam file, yang menyelesaikan masalah Anda yang lain:
cat /var/lock/foo
Mengenai pertanyaan spesifik "Proses mana yang membuka file ini?", Ini dapat berguna ketika Anda ingin meng-unmount sistem file tetapi tidak bisa karena beberapa proses membuka file di dalamnya. Jika Anda tidak memiliki perintah tersebut, Anda dapat meminta /proc
sebagai akar:
ls -l /proc/*/cwd | grep '/var/lock/foo$'
atau, sebagai pengguna fana:
ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'