मैं रियलटाइम में किसी प्रक्रिया की खोली गई फ़ाइलों की निगरानी कैसे करूं?


41

मुझे पता है कि मैं अपनी लिनक्स मशीन lsof पर उस समय का उपयोग करके एक प्रक्रिया की खुली हुई फाइलें देख सकता हूं । हालाँकि, एक प्रक्रिया इतनी जल्दी किसी फ़ाइल को खोल, बदल और बंद कर सकती है कि मैं इसे मानक शेल स्क्रिप्टिंग (उदाहरण के लिए watch) का उपयोग करके मॉनिटर करते समय नहीं देख पाऊंगा जैसा कि "लिनक्स (वास्तविक समय) पर खुली प्रक्रिया फ़ाइलों की निगरानी" में बताया गया है। ।

इसलिए, मुझे लगता है कि मैं एक प्रक्रिया का ऑडिट करने का एक सरल तरीका ढूंढ रहा हूं और यह देखता हूं कि गुजरे समय के दौरान इसने क्या किया है। यह बहुत अच्छा होगा अगर यह देखना संभव हो जाए कि प्रक्रिया शुरू होने से पहले ऑडिट शुरू किए बिना चलने के लिए क्या नेटवर्क कनेक्शन इसे बनाने की कोशिश करता है (ऑडिट करना) और ऑडिट शुरू करना।

आदर्श रूप में, मैं यह करना चाहूंगा:

sh $ audit-lsof /path/to/executable
4530.848254 OPEN  read  /etc/myconfig
4530.848260 OPEN  write /var/log/mylog.log
4540.345986 OPEN  read  /home/gert/.ssh/id_rsa          <-- suspicious
4540.650345 OPEN  socket TCP ::1:34895 -> 1.2.3.4:80    |
[...]
4541.023485 CLOSE       /home/gert/.ssh/id_rsa          <-- would have missed
4541.023485 CLOSE socket TCP ::1:34895 -> 1.2.3.4:80    |   this when polling

क्या straceहर सिस्टम कॉल को न देखने के लिए कुछ झंडे और कुछ झंडे का इस्तेमाल संभव होगा ?


जवाबों:


50

इसके साथ चल रहा है

strace -e trace=open,close,read,write,connect,accept your-command-here

शायद पर्याप्त होगा।

यदि आप -oप्रक्रिया को स्टेंडर पर प्रिंट कर सकते हैं, तो आपको कंसोल के अलावा कहीं और स्ट्रेस का आउटपुट डालने के लिए विकल्प का उपयोग करने की आवश्यकता होगी । यदि आपका प्रक्रिया कांटे, आप भी आवश्यकता होगी -fया -ff

ओह, और आप भी चाहते हैं -t, तो आप देख सकते हैं कि कॉल कब हुआ।


ध्यान दें, आपको अपनी प्रक्रिया के आधार पर फ़ंक्शन कॉल सूची को ट्विक करने की आवश्यकता हो सकती है - मुझे getdentsउदाहरण के लिए जोड़ने की जरूरत है , बेहतर नमूना उपयोग करने के लिए ls:

$ strace -t -e trace=open,close,read,getdents,write,connect,accept ls >/dev/null
...
09:34:48 open("/etc/ld.so.cache", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open("/lib64/libselinux.so.1", O_RDONLY) = 3
09:34:48 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@V\0\0\0\0\0\0"..., 832) = 832
09:34:48 close(3)                       = 0
...
09:34:48 open("/proc/filesystems", O_RDONLY) = 3
09:34:48 read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 366
09:34:48 read(3, "", 1024)              = 0
09:34:48 close(3)                       = 0
09:34:48 open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
09:34:48 getdents(3, /* 5 entries */, 32768) = 144
09:34:48 getdents(3, /* 0 entries */, 32768) = 0
09:34:48 close(3)                       = 0
09:34:48 write(1, "file-A\nfile-B\nfile-C\n", 21) = 21
09:34:48 close(1)                       = 0
09:34:48 close(2)                       = 0

1
यह सही दिशा में हो रहा है, धन्यवाद! अधिक उपयोगकर्ता के अनुकूल उत्पादन करना चाहते हैं, लेकिन यह काम करता है। मुझे इसके लिए अधिक शीर्ष जैसे इंटरफ़ेस वाले टूल को लिखने में समय लग सकता है। मैं एक ncurses- आधारित या 'टॉप' की तरह उम्मीद कर रहा था कि बाइनरी के कार्यों का वास्तविक समय का निरीक्षण करने के लिए उपकरण मौजूद होगा।
gertvdijk

आप इसे कैसे देखना चाहेंगे? संभवत: स्ट्रेस आउटपुट को कुछ फ्रेंडली में मून करना संभव है।
बेकार

आप निश्चित रूप -oसे फ़ाइल (ओं) को आउटपुट पुश करने के लिए उपयोग करना चाहते हैं । फिर आप tail -F strace.output"लाइव" अपडेट प्राप्त करने के लिए दूसरे टर्मिनल में चला सकते हैं ।
पीटर डे

4
आप विकल्प के straceसाथ एक रनिंग प्रोसेस से भी जुड़ सकते हैं -p PID
फ्रैंक

-y"[P] फ़ाइल डिस्क्रिप्टर तर्कों के साथ जुड़े हुए मार्ग" में जोड़ें
ricab
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.