सवाल मैं कैसे निर्धारित कर सकता हूं कि लिनक्स में फाइल किस फाइल को खोलती है?


मैं यह निर्धारित करना चाहता हूं कि किस प्रक्रिया में लॉक-फाइल का स्वामित्व है। लॉक-फाइलें केवल एक विशिष्ट नाम वाली फ़ाइल होती हैं जिसे बनाया गया है।

तो, मैं कैसे निर्धारित कर सकता हूं कि लिनक्स में एक विशेष फ़ाइल किस प्रक्रिया में खुलती है? अधिमानतः एक-लाइनर प्रकार या एक विशेष लिनक्स उपकरण समाधान इष्टतम होगा।


112
2018-01-19 16:08


मूल




जवाब:


आप भी उपयोग कर सकते हैं fuser इसके लिए:

~> less .vimrc
# put in background
~> fuser .vimrc
.vimrc:              28135
~> ps 28135
  PID TTY      STAT   TIME COMMAND
28135 pts/36   T      0:00 less .vimrc

49
2018-01-19 17:37



यह बहुत अच्छा था, लेकिन इसे एक स्क्रिप्ट में उपयोग करने के लिए मुझे आउटपुट की लंबाई जांचनी पड़ी। - chovy
आउटपुट की लंबाई का क्या मतलब है? - Nathan Fellman
if [ फ्यूसर "$ फ़ाइल" `]; फिर बाहर निकलें ' - chovy
फ्यूसर के बाहर निकलने वाले कोड के साथ अजीब व्यवहार है। यह दो राज्यों के साथ 1 निकासकोड देता है: ए / कुछ आंतरिक त्रुटि, चेक फ़ाइल नहीं मिली आदि, बी / कोई प्रक्रिया निर्दिष्ट फ़ाइल नहीं खोली गई। स्थिति में ए / कुछ त्रुटि संदेश इसके आउटपुट में मुद्रित किया जाता है। दुर्भाग्यवश जब फ़ाइल किसी चीज़ द्वारा उपलब्ध और खोला जाता है, आउटपुट उत्पन्न होता है लेकिन निकास कोड 0 के साथ। यह बेहतर होगा अगर फ्यूसर तीन कोडों से बाहर निकल जाए, न कि वर्तमान में दो। lsoft थोड़ा बुरा संकल्प है क्योंकि यह धीरे-धीरे काम कर रहा है। - Znik
यह अनिवार्य रूप से वही पैटर्न है जो ls निम्नानुसार है - यदि कोई त्रुटि है तो यह निकास कोड 2 लौटाता है (उदा।, अमान्य विकल्प निर्दिष्ट) या फ़ाइल नहीं मिली (और 0 अगर यह सफलतापूर्वक सूचना रिपोर्ट करता है)। - Scott


अधिकांश लिनक्स सिस्टम पर lsof NAME नौकरी करता है:

fin@r2d2:~$ 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
fin@r2d2:~$

134
2018-01-19 16:18



और क्या होगा यदि आपके पास lsof नहीं है? - JoseLSegura
@ जोसेएलसेगुरा: मुझे लगता है कि आप उत्तर के लिए पर्याप्त संसाधन हैं, फिर आपके लिए बेकार होने के लिए lsof 'इंस्टॉल करें। क्या आप अपनी समस्या पर विस्तार कर सकते हैं? यदि आपके पास रूट नहीं है, तो संभवतः आपके पास यह पता लगाने के लिए निजी नहीं है कि किसी अन्य उपयोगकर्ता के पास फ़ाइल किसी भी तरह से खुलती है या नहीं। - Michael Scheper


फ़ाइल खोलने के बाद लॉक नहीं है क्योंकि, अगर प्रत्येक प्रक्रिया को यह जांचना पड़ता है कि फाइल पहले खुलती है और यदि यह नहीं है तो इसे आगे बढ़ाएं या नहीं खोलें, तो दो प्रक्रियाएं एक साथ जांच कर सकती हैं, दोनों खोज कि यह खुला नहीं है, तो दोनों इसे बनाते हैं या खोलते हैं।

लॉक के रूप में फ़ाइल का उपयोग करने के लिए, चेक-एंड-लॉक ऑपरेशन को एक अनियंत्रित ऑपरेशन होना चाहिए। आप इसे यूनिक्स फाइल सिस्टम में रीड-ओनली मोड के साथ फ़ाइल बनाकर और अनलॉक करने के लिए इसे हटाकर प्राप्त कर सकते हैं। अगर फ़ाइल मौजूद है (और केवल पढ़ा जाता है) फ़ाइल निर्माण विफल हो जाएगा, तो आपको एक परमाणु ऑपरेशन में चेक-एंड-लॉक मिल जाएगा।

यदि आपकी लॉकिंग प्रक्रिया एक शेल स्क्रिप्ट है जो डेमॉन के रूप में चल रही है, तो आप इसका उपयोग करके इस प्रभाव को प्राप्त कर सकते हैं umask, एक प्रति-प्रक्रिया सेटिंग जो अनुमतियों को सेट करती है जो नई फाइलें बनाई गई हैं:

oldumask = $ (umask)
umask 222 # फ़ाइलों को मालिक के लिए भी अयोग्य बनाते हैं
अगर echo $$> / var / lock / foo
फिर
    : लॉकिंग सफल हुआ
अन्य
    : लॉकिंग असफल रहा
फाई
umask $ oldumask
यह फ़ाइल में स्वयं की प्रक्रिया 'पीआईडी ​​भी लिखता है, जो आपकी दूसरी समस्या हल करता है: cat /var/lock/foo
विशिष्ट प्रश्न के संबंध में "कौन सी प्रक्रियाओं में यह फ़ाइल खुलती है?", यह तब उपयोगी हो सकता है जब आप किसी फाइल सिस्टम को अनमाउंट करना चाहते हैं लेकिन ऐसा नहीं कर सकता क्योंकि कुछ प्रक्रिया में फ़ाइल खुलती है। यदि आपके पास उन आदेशों को उपलब्ध नहीं है, तो आप पूछ सकते हैं /proc रूट के रूप में:

ls -l /proc/*/cwd | grep '/var/lock/foo$'

या, एक प्राणघातक उपयोगकर्ता के रूप में:

ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'


8
2018-01-20 13:14



'ls -l' विधि लिनक्स के लिए काम करती है लेकिन लगता है कि साइगविन के लिए काम नहीं कर रहा है: फाइल लॉकिंग के बारे में कोई जानकारी नहीं है। क्या आप नहीं जानते कि कैसे हल करें? धन्यवाद। - Sopalajo de Arrierez
नहीं, आप लॉक के लिए केवल-पढ़ने वाली फ़ाइल नहीं बनाते हैं, क्योंकि जब आपका ऐप क्रैश हो जाएगा, तो फ़ाइल अभी भी वहां होगी। आपके दुर्घटनाग्रस्त ऐप मानसिक होने के बाद उपयोगकर्ता को बकवास साफ़ करने के लिए मजबूर करना। - polkovnikov.ph


यदि आप जानना चाहते हैं कि बिना किसी सटीक प्रक्रिया की फ़ाइल डिस्क्रिप्टर आपकी फ़ाइल के लिंक क्यों है lsof या fuser - के माध्यम से खोजें /proc:

$ find /proc -regex '\/proc\/[0-9]+\/fd\/.*' -type l -lname "*$1*" -printf "%p -> %l\n" 2> /dev/null

बदलने के $1 खुले फ़ाइल नाम के साथ आप खोज रहे हैं। आप संशोधन कर सकते हैं -printf जो भी आप देखना चाहते हैं, या पाइप में egrep -o '[0-9]+' | head -1 के साथ प्रयोग के लिए ps -Fp <पीआईडी> उस प्रक्रिया की जानकारी के लिए।

$ lsof <फ़ाइल नाम> @fin द्वारा जवाब सबसे अच्छा जवाब है, जाहिर है, लेकिन जवाब देने के लिए @ जोसएलसेगुरा की टिप्पणी, यदि यह उपलब्ध नहीं है, तो ऊपर दिया गया समाधान मेरी प्रतिक्रिया थी।


4
2017-11-15 21:41





मैंने पाया कि स्वीकृत उत्तर का उपयोग करने से मेरी निर्देशिका (उबंटू 14.04) का उपयोग करने वाली प्रक्रियाओं की सूची नहीं मिली है।

अंत में, मैंने lsof (खुली फाइलों की सूची) का उपयोग किया और अपमानजनक प्रक्रिया को खोजने के लिए अपने आउटपुट को दबा दिया:

lsof | egrep "<regexp-for-your-file>"

2
2017-10-30 14:21