फ़ाइल लॉक करने की प्रक्रियाओं को कैसे सूचीबद्ध करें?


51

उपयोग करते हुए flock, कई प्रक्रियाओं में एक ही समय में एक साझा लॉक हो सकता है, या राइट लॉक प्राप्त करने के लिए प्रतीक्षा की जा सकती है। मुझे इन प्रक्रियाओं की सूची कैसे मिल सकती है?

वह है, किसी दिए गए फ़ाइल X के लिए, आदर्श रूप से प्रत्येक प्रक्रिया की प्रक्रिया आईडी को खोजने के लिए जो या तो रखती है, या फ़ाइल पर लॉक की प्रतीक्षा कर रही है। यह एक बहुत अच्छी शुरुआत होगी, हालांकि सिर्फ एक लॉक की प्रतीक्षा करने वाली प्रक्रियाओं की संख्या की एक गिनती प्राप्त करने के लिए।

जवाबों:


42

lslocks, उपयोग -लिनक्स पैकेज से , ठीक यही करता है।

में MODEस्तंभ, एक ताला के लिए इंतज़ार कर प्रक्रियाओं एक साथ चिह्नित किया जाएगा *


3
Apt-cache कहता है कि उपयोग-लिनेक्स पहले से ही नवीनतम संस्करण (2.20.1-1ubuntu3) है, लेकिन मेरे पास llocklock नहीं है; क्या कोई रेपो है जो मैं उपयोग कर सकता हूं जो मुझे देगा?
बेनुबर्ड

2
ऐसा लगता है कि यह 2.22 में जोड़ा गया था, इसलिए उबंटू का संस्करण बहुत पुराना है। संभवतः एक नया संस्करण अंततः उपलब्ध होगा। (यह भी RHEL 6 या CentOS के मामले में है।) आप इसे स्वयं बना सकते हैं, या आप lsofजोएल डेविस के सुझाव का उपयोग कर सकते हैं ।
mattdm

6
lslocksपढ़ता है /proc/locks, एक चुटकी में आप पढ़ सकते हैं कि सीधे अपने आप को, कैविट के साथ कि फाइलों को नाम के बजाय डिवाइस और इनोड द्वारा पहचाना जाता है। चूँकि आप फ़ाइल जानते हैं, इसलिए समस्या नहीं होनी चाहिए। अवरोधित प्रविष्टियों ->में लॉक प्रकार के कॉलम से पहले एक उपसर्ग होता है (इस प्रकार उस पंक्ति में एक कॉलम जोड़ना)।
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.

तो ऊपर का "एफडी" कॉलम lsofटूट जाता है:

10इस खुली फाइल का शाब्दिक विवरण। किस से जुड़ा हुआ है/proc/1650/fd/10

u फ़ाइल पढ़ने और लिखने के लिए खुली है

W प्रोग्राम में फाइल पर राइट लॉक है।


1
मुझे पता नहीं है कि मुझे lslk कहां मिलेगा, और ऐसा प्रतीत होता है कि अब इसका रखरखाव नहीं किया जाएगा। इस ओर इशारा करते हुए, यह भी है कि यदि आप चाहते हैं कि lsof केवल उन प्रक्रियाओं को दिखाए जो वास्तव में फ़ाइल को लॉक कर रही हैं, तो आपको "^ म्यूटेक्स" के लिए grep करना होगा। यह 'होल्डिंग' और 'ब्लॉकिंग' में भी अंतर नहीं करता है।
बेनुबर्ड

एफडी क्षेत्र का पहला अक्षर चरित्र वह फ़ाइल है जिसमें उसके द्वारा खोली गई फ़ाइल है (मैं मान रहा हूं कि आपके पास रखने का क्या मतलब है) वैकल्पिक दूसरा अक्षर चरित्र लॉक है (यदि कोई है) तो यह फ़ाइल पर है (जिसे मैं ' m मान रहा है कि आप "अवरुद्ध" से क्या मतलब है) इसके अलावा flock! = mutex। आपका grep पोस्ट में एक की तरह ताले से चूक गया होगा (पहले फ़ील्ड का उल्लेख प्रोग्राम नाम नहीं है ...)
ब्राचली

डी 'ओह! आप सही कह रहे हैं - "म्यूटेक्स" मेरी स्क्रिप्ट का नाम था, इसलिए 'म्यूटेक्स' के लिए पकड़ना केवल मेरे मामले पर लागू होता है। उस ओर इशारा करने के लिए धन्यवाद
बेनुबर्ड

अच्छी तरह से लगता है कि मैंने एक बू-बू भी बनाया: "पहला अक्षर चरित्र वह मोड है जिसके साथ फ़ाइल खोली गई है ..."
ब्राचली

5

lsof फ़ाइल की सूची देखने में मदद कर सकता है। यहाँ बंद फ़ाइलों को देखने का तरीका है।

sudo lsof /var/lib/dpkg/lock 

0

यदि lsofसिस्टम में ही गायब है, ls /proc/*/fd/* | grep LOCK_FILE_NAMEतो वही जानकारी प्रदान करनी चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.