Bagaimana daftar proses penguncian file?


51

Dengan menggunakan flock, beberapa proses dapat memiliki kunci bersama pada saat yang sama, atau menunggu untuk mendapatkan kunci tulis. Bagaimana cara saya mendapatkan daftar proses ini?

Yaitu, untuk file X yang diberikan, idealnya untuk menemukan id proses dari setiap proses yang menahan, atau sedang menunggu, kunci pada file tersebut. Ini akan menjadi awal yang sangat baik meskipun hanya untuk mendapatkan jumlah proses menunggu kunci.

Jawaban:


42

lslocks, dari paket util-linux , melakukan hal ini.

Di MODEkolom, proses menunggu kunci akan ditandai dengan a *.


3
Apt-cache mengatakan bahwa util-linux sudah menjadi versi terbaru (2.20.1-1ubuntu3), tetapi saya tidak memiliki lslocks; apakah ada repo yang bisa saya gunakan yang akan memberi saya itu?
Benubird

2
Sepertinya ini ditambahkan pada 2.22, jadi versi Ubuntu terlalu lama. Agaknya versi baru akan tersedia pada akhirnya. (Ini juga halnya dengan RHEL 6 atau CentOS.) Anda dapat membangunnya sendiri, atau Anda dapat menggunakan lsofpendekatan yang disarankan Joel Davis.
mattdm

6
lslocksmembaca /proc/locks, dalam keadaan darurat Anda dapat membacanya secara langsung sendiri, dengan peringatan bahwa file diidentifikasi oleh perangkat dan inode daripada nama. Karena Anda tahu file itu, seharusnya tidak menjadi masalah. Entri yang diblokir memiliki ->awalan sebelum kolom jenis kunci (sehingga menambahkan kolom ke baris itu).
mr.spuratic

27

Dua kemungkinan: lsof(preferensi saya) atau lslk(khusus untuk kunci file):

[root@policyServer ~]# lslk | grep "master.lock"
SRC          PID   DEV  INUM   SZ TY M   ST WH  END LEN NAME
master      1650 253,0 12423   33  w 0    0  0    0   0 /var/lib/postfix/master.lock

[root@policyServer ~]# lsof | grep "master.lock"
master     1650      root   10uW     REG              253,0       33      12423 /var/lib/postfix/master.lock

Output lslk adalah self-expanatory tetapi lsofmenempatkan deskripsi kunci di kolom "FD" (yang di 10uWatas). Dari halaman manual:

The mode character is followed by one of these lock characters, describing the type of lock applied to the file:

N for a Solaris NFS lock of unknown type;
r for read lock on part of the file;
R for a read lock on the entire file;
w for a write lock on part of the file;
W for a write lock on the entire file;
u for a read and write lock of any length;
U for a lock of unknown type;
x for an SCO OpenServer Xenix lock on part      of the file;
X for an SCO OpenServer Xenix lock on the      entire file;
                       space if there is no lock.

Jadi kolom "FD" di lsofatas terurai menjadi:

10Deskriptor literal dari file terbuka ini. Apa yang ditautkan oleh/proc/1650/fd/10

u File terbuka untuk membaca dan menulis

W Program memiliki kunci tulis pada file.


1
Saya tidak dapat menemukan tempat untuk mendapatkan lslk, dan tampaknya tidak lagi dipertahankan. Layak menunjukkan juga, adalah bahwa jika Anda hanya ingin menunjukkan proses yang benar-benar mengunci file, Anda perlu mencari "^ mutex". Itu juga tidak membedakan antara 'memegang' dan 'memblokir'.
Benubird

Karakter huruf pertama dari bidang FD adalah file yang dibuka dengan file tersebut (saya berasumsi itu yang Anda maksud dengan memegang) karakter huruf kedua opsional adalah kunci (jika ada) yang ada pada file (yang saya ' m mengasumsikan adalah apa yang Anda maksud dengan "memblokir") Juga flock! = mutex. Grep Anda akan kehilangan kunci seperti yang ada di pos (belum lagi bidang pertama adalah nama program ...)
Bratchley

Doh! Anda benar - "mutex" adalah nama skrip saya, jadi memahami 'mutex' hanya berlaku untuk kasus saya. Terima kasih telah menunjukkannya
Benubird


5

Ia dapat membantu melihat daftar file. di sini adalah cara untuk melihat file yang terkunci.

sudo lsof /var/lib/dpkg/lock 

0

dalam kasus lsofitu sendiri hilang pada sistem, ls /proc/*/fd/* | grep LOCK_FILE_NAMEharus memberikan informasi yang sama.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.