प्रोग्राम द्वारा एक्सेस की गई फ़ाइलों की सूची बनाएं


64

time एक शानदार कमांड है यदि आप यह जानना चाहते हैं कि किसी दिए गए कमांड में कितना सीपीयू समय लगता है।

मैं कुछ ऐसी ही चीजों की तलाश कर रहा हूं, जो प्रोग्राम और उसके बच्चों द्वारा एक्सेस की जा रही फाइलों को सूचीबद्ध कर सकें। या तो वास्तविक समय में या बाद में एक रिपोर्ट के रूप में।

वर्तमान में मैं उपयोग करता हूं:

#!/bin/bash

strace -ff -e trace=file "$@" 2>&1 | perl -ne 's/^[^"]+"(([^\\"]|\\[\\"nt])*)".*/$1/ && print'

लेकिन यह विफल रहता है अगर चलाने के लिए कमांड शामिल है sudo। यह बहुत बुद्धिमान नहीं है (यह अच्छा होगा यदि यह केवल मौजूदा फ़ाइलों को सूचीबद्ध कर सकता है या जिन्हें अनुमति की समस्या थी या उन्हें उन फ़ाइलों में समूह बना सकते हैं जो पढ़ी जाती हैं और जो फाइलें लिखी जाती हैं)। यह straceधीमा है, इसलिए यह तेज विकल्प के साथ अच्छा होगा।


आपके उपयोग को देखते हुए strace, मुझे लगता है कि आप विशेष रूप से लिनक्स में रुचि रखते हैं। सही बात?
गिल्स

लिनक्स मेरी प्राथमिक चिंता है।
ओले तांगे

जवाबों:


51

मैंने हार मान ली और अपने खुद के टूल को कोड कर दिया। इसके डॉक्स से उद्धृत करने के लिए:

SYNOPSIS
    tracefile [-adefnu] command
    tracefile [-adefnu] -p pid

OPTIONS
    -a        List all files
    -d        List only dirs
    -e        List only existing files
    -f        List only files
    -n        List only non-existing files
    -p pid    Trace process id
    -u        List only files once

यह केवल फाइलों को आउटपुट करता है जिससे आपको आउटपुट से निपटने की आवश्यकता नहीं है strace

https://gitlab.com/ole.tange/tangetools/tree/master/tracefile


धन्यवाद! स्ट्रेस का आउटपुट बिल्कुल अपठनीय है। मुझे नहीं पता कि डॉक्स को कहां से ढूंढना है - अगर यह एक -h / - हेल्प ऑप्शन होता तो अच्छा होता। मैं एक विकल्प की भी सराहना करता हूं जो केवल फ़ाइल संपादन दिखाता है, एक्सेस नहीं करता।
ज़ेरुस

@Xerus क्लोन क्लोन gitlab.com/ole.tange/tangetools और चलाएँ make && sudo make install। तब तुम दौड़ सकते हो man tracefile
ओले तांगे

4
अच्छा उपकरण। इसे पैक करने के लिए, स्थापित करने के लिए: yum -y install https://extras.getpagespeed.com/release-el7-latest.rpmऔरyum -y install tracefile
दानिला वर्शिन

27

आप सिस्टम कॉल को ट्रेस कर सकते हैं strace, लेकिन वास्तव में एक अपरिहार्य गति दंड है। straceयदि कमांड उन्नत विशेषाधिकार के साथ चलता है, तो आपको रूट के रूप में चलाने की आवश्यकता है :

sudo strace -f -o foo.trace su user -c 'mycommand'

एक और तरीका जो तेजी से होने की संभावना है, एक पुस्तकालय को लोड करने के लिए है जो फाइलसिस्टम एक्सेस फ़ंक्शन के आसपास लपेटता है LD_PRELOAD=/path/to/libmywrapper.so mycommand:। LD_PRELOADवातावरण चर ऊंचा विशेषाधिकारों के साथ लागू किया कार्यक्रमों के लिए पारित नहीं किया जाएगा। आपको उस रैपर लाइब्रेरी का कोड लिखना होगा ( यहाँ "मज़े और लाभ के लिए बिल्डिंग लाइब्रेरी इंटरपोज़र्स से एक उदाहरण" ); मुझे नहीं पता कि वेब पर पुन: प्रयोज्य कोड उपलब्ध है या नहीं।

यदि आप किसी विशेष निर्देशिका पदानुक्रम में फ़ाइलों की निगरानी कर रहे हैं, तो आप लॉग्सएफएस के साथ फाइलसिस्टम का एक दृश्य बना सकते हैं जैसे कि उस दृश्य के माध्यम से सभी प्रवेश लॉग होते हैं।

loggedfs -c my-loggedfs.xml /logged-view
mycommand /logged-view/somedir

LogFS को कॉन्फ़िगर करने के लिए, प्रोग्राम के साथ भेजे गए नमूना कॉन्फ़िगरेशन के साथ शुरू करें और LogFS कॉन्फ़िगरेशन फ़ाइल सिंटैक्स पढ़ें ।

एक और संभावना है लिनक्स का ऑडिट सबसिस्टम । सुनिश्चित करें कि auditdडेमॉन शुरू हो गया है, फिर जो आप लॉग इन करना चाहते हैं उसे कॉन्फ़िगर करें auditctl। प्रत्येक लॉग ऑपरेशन को /var/log/audit/audit.log(विशिष्ट वितरण पर) दर्ज किया गया है । किसी विशेष फ़ाइल को देखना शुरू करने के लिए:

auditctl -a exit,always -w /path/to/file

यदि आप किसी निर्देशिका पर नजर रखते हैं, तो उसमें मौजूद फाइलें और उसके उपनिर्देशिका पुनरावर्ती रूप से भी देखे जाते हैं। ध्यान रखें कि ऑडिट लॉग वाली डायरेक्टरी को न देखें। आप लॉगिंग को कुछ प्रक्रियाओं तक सीमित कर सकते हैं, auditctlउपलब्ध फ़िल्टर के लिए मैन पेज देखें । ऑडिट सिस्टम का उपयोग करने के लिए आपको रूट होना चाहिए।


LD_PRELOADस्थिर बायनेरिज़ पर भी काम नहीं करेगा।
डेविड

6

मुझे लगता है कि आप lsof चाहते हैं (संभवतः प्रोग्राम पर एक grep पर पाइप किया गया है और यह बच्चे हैं)। यह आपको हर उस फाइल को बताएगा जो वर्तमान में फाइल सिस्टम पर एक्सेस की जा रही है। प्रक्रिया द्वारा ( यहाँ से ) एक्सेस की गई फाइलों के बारे में जानकारी के लिए :

lsof -n -p `pidof your_app`

11
लेकिन यह केवल मुझे एक स्नैपशॉट देता है। मुझे क्या चाहिए, इसे एक्सेस करने के लिए किन फ़ाइलों की कोशिश की गई। उस स्थिति के बारे में सोचें जहां कोई कार्यक्रम शुरू होने से इनकार करता है क्योंकि यह "गुम फाइल" कहती है। मैं कैसे पता लगाऊं कि यह किस फ़ाइल की तलाश में था?
ओले तागे

2

मैंने वह कोशिश की tracefile। मेरे लिए इसने अपने मुकाबले बहुत कम मैच दिए strace ... | sed ... | sort -u। मैं भी जोड़ा -s256करने के लिए strace(1)लाइन कमान लेकिन यह बहुत मदद नहीं की ...

फिर मैंने वो कोशिश की loggedfs। पहले यह विफल हो गया क्योंकि मैंने उस निर्देशिका तक पहुंच / पढ़ना नहीं लिखा था जिसके साथ मैंने लॉग इन करने की कोशिश की थी। 755 chmod करने के बाद अस्थायी रूप से मुझे कुछ हिट मिले ...

लेकिन, मेरे लिए, निम्नलिखित काम करना सबसे अच्छा लगता है:

inotifywait -m -r -e OPEN /path/to/traced/directory

और फिर ब्याज की प्रक्रिया को चलाने के बाद आउटपुट को पोस्टप्रोसेस करें।

यह ट्रैस किए गए डायरेक्टरी के फाइल प्रोसेस एक्सेस आउटसाइज़ को पकड़ नहीं पाता है और न ही यह पता चलता है कि क्या किसी अन्य प्रोसेस ने उसी डायरेक्टरी ट्री को एक्सेस किया है, लेकिन कई मामलों में यह काम पाने के लिए काफी अच्छा टूल है।

EDIT: inotifywait सिम्लिंक एक्सेस (सिर्फ़ सॉलिंक के बाद लक्ष्य) को पकड़ नहीं पाता है। जब मैं भविष्य में उपयोग के लिए एक कार्यक्रम द्वारा पहुँचा पुस्तकालयों को संग्रहीत करता था तो मैं इससे प्रभावित हुआ था। उस विशेष मामले में काम पाने के लिए अधिसूचित पुस्तकालयों के साथ सहानुभूति लेने के लिए कुछ अतिरिक्त पर्ल ग्लोब हैकरी का उपयोग किया।

EDIT2: कम से कम जब फ़ाइलें और inotifywait कमांड लाइन (जैसे से खुद को सिमलिंक inotifying inotifywait -m file symlinkया inotifywait symlink file) उत्पादन जो करने के लिए एक (जो, परवाह किए बिना आदेश पंक्ति में पहला है पहुँच दिखाएगा fileकी symlinkएक्सेस किया जाता है)। inotifywait IN_DONT_FOLLOW का समर्थन नहीं करता है - जो, जब मैंने प्रोग्रामेटिक रूप से कोशिश की थी, तो fileकोई भी कमांड लाइन में आदेश की परवाह किए बिना (जो हो सकता है, या क्या नहीं हो सकता है ...) का उपयोग करता है।


"मेरे लिए इसने मेरे मुकाबले बहुत कम मैच दिए" क्या आप tracefileफ़ाइल एक्सेस मिस करने का एक उदाहरण साझा कर सकते हैं ?
ओले तांगे

मुझे यकीन नहीं है कि आप वास्तव में क्या पूछ रहे हैं:) ... अगर मैं अंदर / पथ / / से / पता लगाने / निर्देशिका में फ़ाइलों को देखने की कोशिश करता हूं / मैं आउटपुट को आरेखित करने में OPEN देखता हूं ... लेकिन BUT स्टेट (1) उन फ़ाइलों को सम्मिलित करता है जो मुझे लगता है कुछ मामलों में मैंने कोई परिणाम नहीं पाने के लिए (मुझे आश्चर्य है कि क्यों, कुछ कैशिंग छुपा निर्देशिका सामग्री को पढ़ने से देख रहा है)
Tomi Ollila

मैं नीचे fanotify पोस्ट पर टिप्पणी कर रहा हूं (मेरे पास केवल 21 प्रतिष्ठा है, हालांकि मेरे पास एक दशक से अधिक समय से खाता है, टिप्पणी करने के लिए 50 की आवश्यकता हमेशा मेरे लिए बाधा रही है ...) - fanotify अच्छा सामान है, लेकिन नहीं कर सकता सिम्लिंक डीरेफेरेंस मुद्दे के आसपास जाएं (यानी सिम्बलिंक्स के मामले में, एक्सेस की गई अंतिम फाइल को रीड / प्रूफ़ / सेल्फ / fd / <fd> .. वैसे भी पाया जाता है: वैसे भी +1: जवाब दें: D
Tomi Ollila

1

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

यह https://github.com/tycho-kirchner/shournal पर पाया जा सकता है

शेल पर उदाहरण:

$ shournal -e sh -c 'echo hi > foo1; echo hi2 > foo2'
$ shournal -q --history 1
  # ...
  Written file(s):                                                                                                                                                                              
 /tmp/foo1 (3 bytes) Hash: 15349503233279147316                                                                                                                                             
 /tmp/foo2 (4 bytes) Hash: 2770363686119514911    
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.