कैसे पता करें कि वर्तमान में कौन सी फ़ाइल एक प्रक्रिया द्वारा लिखी गई है


9

मेरी स्थिति यह है कि समय-समय पर एक विशिष्ट प्रक्रिया (इस मामले में, यह थंडरबर्ड है) एक या दो मिनट के लिए उपयोगकर्ता इनपुट पर प्रतिक्रिया नहीं करती है। मुझे पता चला iotopहै कि इस समय के दौरान, यह डिस्क पर काफी लिखता है, और अब मैं यह पता लगाना चाहता हूं कि यह किस फाइल पर लिखता है, लेकिन दुर्भाग्य से iotopप्रति प्रक्रिया केवल आँकड़े देती है और खुली फ़ाइल (-descriptor) के अनुसार नहीं।

मुझे पता है कि मैं यह lsofपता लगाने के लिए उपयोग कर सकता हूं कि वर्तमान में कौन सी फाइलें खुली हैं, लेकिन बेशक थंडरबर्ड उनमें से बहुत से खुले हैं, इसलिए यह उतना उपयोगी नहीं है। iostatप्रति उपकरण केवल आंकड़े दिखाता है।

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


जवाबों:


6

अगर आप स्ट्रेस को सिर्फ प्रोसेस करते समय संलग्न करते हैं (आप पीड प्राप्त कर सकते हैं और कमांड को अग्रिम रूप से पंक्तिबद्ध कर सकते हैं, एक अतिरिक्त टर्मिनल में), यह ब्लॉकिंग राइट के फाइल डिस्क्रिप्टर को दिखाएगा।

तुच्छ उदाहरण:

$ mkfifo tmp
$ cat /dev/urandom > tmp &
[1] 636226
  # this will block on open until someone opens for reading

$ exec 4<tmp
  # now it should be blocked trying to write

$ strace -p 636226
Process 636226 attached - interrupt to quit
write(1, "L!\f\335\330\27\374\360\212\244c\326\0\356j\374`\310C\30Z\362W\307\365Rv\244?o\225N"..., 4096 <unfinished ...>
^C
Process 636226 detached

धन्यवाद, मुझे नहीं पता था कि मैं स्ट्रेस संलग्न कर सकता हूं जबकि प्रक्रिया चल रही है। मैं यह कोशिश करूंगा।
फिलिप वेंडलर

1
आप इस जानकारी को पार कर सकते हैं, यह lsof -p $PIDजानने के लिए कि फ़ाइल डिस्क्रिप्टर पॉइंट कहाँ है
Coren

1
या ls -l /proc/pid/fdLinux पर
बेकार

स्ट्रेस का उपयोग करके मैं वास्तव में वही जान सकता था जो मैं जानना चाहता था, इसलिए फिर से धन्यवाद!
फिलिप वेंडर

2

मुझे लगता है कि आपके पास रूट एक्सेस है, मुझे लगता है कि सबसे अच्छा उपकरण ऑडिट सबसिस्टम होगा । इसके बारे में बहुत साहित्य नहीं है (लेकिन लॉगऑफ़ से अधिक); आप के साथ शुरू कर सकते हैं इस ट्यूटोरियल या एक कुछ उदाहरण या बस के साथ auditctlआदमी पेज । यहां, यह सुनिश्चित करने के लिए पर्याप्त होना चाहिए कि डेमन शुरू हो गया है, फिर auditctlरूट के रूप में चलाएं :

auditctl -a exit,always -F pid=1234 -F dir=/home/philipp

यह /var/log/audit/audit.logहर बार लॉग्स के लिए लिखेगा प्रक्रिया 1234 के साथ प्रक्रिया कहीं के तहत लिखता है /home/philipp। ओवरहेड काफी छोटा है, की तुलना में बहुत छोटा है strace


ऑडिट सबसिस्टम को स्ट्रेस करने के दिलचस्प विकल्प के रूप में इंगित करने के लिए धन्यवाद। हालाँकि, यह यहाँ मदद करने के लिए प्रतीत नहीं होता है क्योंकि यह केवल फ़ाइल को खोलने पर लॉग करने के लिए लगता है, और इस प्रकार मुझे पता नहीं चल सकता है कि प्रत्येक फ़ाइल में कितना लिखा गया है।
फिलिप वेंडलर

@PhilippWendler आह। हममम। जोड़ने -S read -S write(अनछुए) का प्रयास करें ।
गिलेस एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.