จะแสดงรายการกระบวนการล็อกไฟล์ได้อย่างไร


51

การใช้flockหลายกระบวนการสามารถมีการล็อกแบบแบ่งใช้ในเวลาเดียวกันหรือกำลังรอรับล็อกการเขียน ฉันจะรับรายการกระบวนการเหล่านี้ได้อย่างไร

นั่นคือสำหรับไฟล์ X ที่ให้มาโดยเฉพาะเพื่อค้นหา id กระบวนการของแต่ละกระบวนการที่มีอยู่หรือกำลังรอการล็อกไฟล์ มันจะเป็นการเริ่มต้นที่ดีมากแม้ว่าจะได้รับจำนวนกระบวนการที่รอการล็อก

คำตอบ:


42

lslocksจากแพ็กเกจ util-linuxทำสิ่งนี้ทั้งหมด

ในคอลัมน์กระบวนการรอการล็อคจะถูกทำเครื่องหมายด้วยMODE*


3
Apt-cache บอกว่า util-linux เป็นเวอร์ชั่นใหม่ล่าสุดแล้ว (2.20.1-1ubuntu3) แต่ฉันไม่มี lslocks; มี repo ฉันสามารถใช้ที่จะให้ฉันได้หรือไม่
Benubird

2
ดูเหมือนว่าจะมีการเพิ่มใน 2.22 ดังนั้นเวอร์ชันของ Ubuntu จึงเก่าเกินไป น่าจะเป็นรุ่นใหม่ในที่สุด (นี่เป็นกรณีของ RHEL 6 หรือ CentOS) คุณสามารถสร้างได้ด้วยตัวคุณเองหรือคุณอาจใช้lsofวิธีที่ Joel Davis แนะนำ
mattdm

6
lslocksอ่านได้/proc/locksในเวลาไม่นานคุณสามารถอ่านได้ด้วยตัวคุณเองโดยตรงโดยมีข้อแม้ว่าไฟล์ถูกระบุโดยอุปกรณ์และ inode แทนที่จะเป็นชื่อ เมื่อคุณรู้จักไฟล์นั่นก็ไม่น่าจะมีปัญหาอะไร รายการที่ถูกบล็อกมี->คำนำหน้าก่อนคอลัมน์ประเภทล็อค (เช่นการเพิ่มคอลัมน์ในบรรทัดนั้น)
mr.spuratic

27

สองความเป็นไปได้: lsof(การตั้งค่าของฉัน) หรือlslk(โดยเฉพาะสำหรับการล็อคไฟล์):

[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

เอาต์พุตของ lslk เป็นตัวขยายตัวเอง แต่lsofวางคำอธิบายการล็อกไว้ในคอลัมน์ "FD" (ซึ่งอยู่10uWด้านบน) จากหน้าคน:

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.

ดังนั้นคอลัมน์ "FD" ของlsofด้านบนแบ่งลงเป็น:

10ตัวบ่งชี้ที่แท้จริงของไฟล์ที่เปิดนี้ สิ่งที่เชื่อมโยงโดย/proc/1650/fd/10

u ไฟล์เปิดสำหรับการอ่านและการเขียน

W โปรแกรมมีล็อคการเขียนไฟล์


1
ฉันหาที่ไม่ได้รับ lslk และดูเหมือนว่าจะไม่ได้รับการดูแลอีกต่อไป ถ้าคุณต้องการให้ lsof แสดงเฉพาะกระบวนการที่ล็อกไฟล์จริงๆคุณต้อง grep สำหรับ "^ mutex" และยังไม่แยกความแตกต่างระหว่าง 'การถือครอง' และ 'การปิดกั้น'
Benubird

อักขระตัวอักษรตัวแรกของฟิลด์ FD คือไฟล์ที่มีไฟล์เปิดอยู่ (ฉันสมมติว่านั่นคือสิ่งที่คุณหมายถึงโดยถือ) ตัวอักษรตัวที่สองตัวเลือกที่สองคือล็อค (ถ้ามี) มันมีอยู่ในไฟล์ (ซึ่งฉัน m คือสิ่งที่คุณหมายถึงโดย "บล็อก") นอกจากนี้flock! = mutex grep ของคุณจะพลาดการล็อคเหมือนที่โพสต์ (ไม่ต้องพูดถึงฟิลด์แรกคือชื่อโปรแกรม ... )
Bratchley

D'โอ้! คุณพูดถูก - "mutex" เป็นชื่อสคริปต์ของฉันดังนั้นการ grepping สำหรับ 'mutex' จะใช้กับกรณีของฉันเท่านั้น ขอบคุณสำหรับการชี้ให้เห็นว่า
Benubird

ดูเหมือนว่าฉันจะทำบูบูด้วยเช่นกัน: "ตัวอักษรตัวแรกคือโหมดที่ไฟล์เปิดด้วย ... "
Bratchley

5

lsof สามารถช่วยในการดูรายการของไฟล์ นี่คือวิธีดูไฟล์ที่ล็อค

sudo lsof /var/lib/dpkg/lock 

0

ในกรณีที่lsofตัวเองหายไปในระบบls /proc/*/fd/* | grep LOCK_FILE_NAMEควรให้ข้อมูลเดียวกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.