একটি প্রোগ্রাম দ্বারা অ্যাক্সেস করা ফাইলগুলি তালিকাবদ্ধ করুন


64

time প্রদত্ত কমান্ডটি কতটা সিপিইউ সময় নেয় তা নির্ধারণ করতে চাইলে একটি উজ্জ্বল কমান্ড।

আমি অনুরূপ কিছু সন্ধান করছি যা একটি প্রোগ্রাম এবং এর শিশুদের দ্বারা অ্যাক্সেস করা ফাইলগুলি তালিকাভুক্ত করতে পারে। হয় বাস্তব সময়ে বা পরে একটি প্রতিবেদন হিসাবে।

বর্তমানে আমি ব্যবহার:

#!/bin/bash

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

কমান্ড চালানোর সাথে জড়িত থাকলে এটি ব্যর্থ হয় sudo। এটি খুব বুদ্ধিমান নয় (এটি কেবলমাত্র বিদ্যমান ফাইলগুলির তালিকাতে থাকতে পারে বা অনুমতি সংক্রান্ত সমস্যাগুলি থাকতে পারে বা তাদের পড়া ফাইলগুলি এবং লিখিত ফাইলগুলিতে গ্রুপবদ্ধ করা ভাল হবে) nice এছাড়াও 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 / - সহায়তা বিকল্পটি থাকলে ভাল হবে। আমি এমন একটি বিকল্পেরও প্রশংসা করব যা কেবল ফাইল সম্পাদনাগুলি দেখায়, অ্যাক্সেসগুলিতে নয়।
জেরুস

@ জেরুস ক্লোন 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 mycommandLD_PRELOADএনভায়রনমেন্ট ভেরিয়েবল উবু অধিকারসহ প্রার্থনা প্রোগ্রাম প্রেরণ করা হবে না। আপনাকে সেই মোড়কের লাইব্রেরির কোড লিখতে হবে ( এখানে "মজাদার এবং লাভের জন্য বিল্ডিং লাইব্রেরি ইন্টারপোজারগুলি" থেকে একটি উদাহরণ রয়েছে ); ওয়েবে পুনরায় ব্যবহারযোগ্য কোড উপলব্ধ আছে কিনা তা আমি জানি না।

আপনি যদি কোনও নির্দিষ্ট ডিরেক্টরি শ্রেণিবিন্যাসের ফাইলগুলি পর্যবেক্ষণ করেন তবে আপনি লগডএফএফএসের সাহায্যে ফাইল সিস্টেমের এমন একটি ভিউ তৈরি করতে পারেন যাতে এই দৃশ্যের মাধ্যমে সমস্ত অ্যাক্সেস লগ হয়।

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

লগডএফএস কনফিগার করতে, প্রোগ্রামের সাথে প্রেরিত নমুনা কনফিগারেশনটি দিয়ে শুরু করুন এবং লগডএফএস কনফিগারেশন ফাইল সিনট্যাক্সটি পড়ুন

আরেকটি সম্ভাবনা লিনাক্সের অডিট সাবসিস্টেমauditdডেমনটি শুরু হয়েছে কিনা তা নিশ্চিত করুন , তারপরে আপনি লগইন করতে চান তা কনফিগার করুন auditctl। প্রতিটি লগ করা অপারেশন রেকর্ড করা হয় /var/log/audit/audit.log(সাধারণ বিতরণে)। একটি নির্দিষ্ট ফাইল দেখা শুরু:

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

আপনি যদি কোনও ডিরেক্টরিতে একটি ঘড়ি রাখেন তবে এতে থাকা ফাইলগুলি এবং এর উপ-ডিরেক্টরিগুলি পুনরাবৃত্তভাবে পর্যবেক্ষণ করা হয়। নিরীক্ষণ লগযুক্ত ডিরেক্টরিটি না দেখার জন্য খেয়াল রাখুন। আপনি লগিংকে নির্দিষ্ট প্রক্রিয়াগুলিতে সীমাবদ্ধ করতে পারেন, auditctlউপলব্ধ ফিল্টারগুলির ম্যান পৃষ্ঠাটি দেখুন । অডিট সিস্টেমটি ব্যবহার করার জন্য আপনাকে রুট হওয়া দরকার।


LD_PRELOADস্থির বাইনারিগুলিতেও কাজ করবে না।
ডেভিড

6

আমি মনে করি আপনি এলএসফ চান (সম্ভবত প্রোগ্রামটির একটি গ্রেপের সাথে পাইপ করা এবং এটি শিশুরা)। এটি আপনাকে বর্তমানে ফাইল সিস্টেমে অ্যাক্সেস করা প্রতিটি ফাইল বলবে। প্রক্রিয়া দ্বারা কোন ফাইল অ্যাক্সেস করা হয়েছে সে সম্পর্কে তথ্যের জন্য ( এখান থেকে ):

lsof -n -p `pidof your_app`

11
তবে এটি আমাকে কেবল একটি স্ন্যাপশট দেয়। আমার যা দরকার তা হ'ল এটি ফাইলগুলি অ্যাক্সেস করার চেষ্টা করেছিল। এমন একটি পরিস্থিতি নিয়ে ভাবুন যেখানে কোনও প্রোগ্রাম শুরু করতে অস্বীকৃতি জানায় কারণ এটি "ফাইল মিসিং" বলে। এটি কী ফাইলটি সন্ধান করছে তা আমি কীভাবে আবিষ্কার করব?
ওলে টেঞ্জ

2

আমি চেষ্টা করেছিলাম tracefile। আমার জন্য এটি আমার নিজের চেয়ে অনেক কম ম্যাচ দিয়েছে strace ... | sed ... | sort -u। আমি এমনকি যোগ -s256করার strace(1)লাইন আদেশ কিন্তু এটা অনেক সাহায্য করা হয়নি ...

তারপরে আমি চেষ্টা করেছিলাম loggedfs। প্রথমে এটি ব্যর্থ হয়েছে যেহেতু আমি যে ডিরেক্টরিটিতে লগ ইন করার চেষ্টা করেছি সেটিতে আমার পড়া / লেখার অ্যাক্সেস নেই। অস্থায়ীভাবে chmod 755 করার পরে আমি কিছু হিট পেয়েছি ...

তবে, আমার জন্য, নিম্নলিখিতগুলি করা ভাল মনে হয়:

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

এবং তারপরে সুদের প্রক্রিয়াটি চালিয়ে যাওয়ার পরে আউটপুট পোস্ট করুন।

এটি ট্রেসড ডিরেক্টরিতে ফাইল প্রক্রিয়া অ্যাক্সেসের আউটসিসকে ধরে না বা অন্য কোনও প্রক্রিয়া একই ডিরেক্টরি ট্রিটিতে অ্যাক্সেস করেছে কিনা তা জানে না, তবে বেশিরভাগ ক্ষেত্রে কাজটি সম্পন্ন করার জন্য এটি যথেষ্ট উপযুক্ত সরঞ্জাম।

সম্পাদনা: ইনোটিফয়েট সিমলিংক অ্যাক্সেস ধরেনি (সিমলিংকের সমাধানের পরে কেবল লক্ষ্যগুলি)। ভবিষ্যতে ব্যবহারের জন্য কোনও প্রোগ্রাম দ্বারা অ্যাক্সেস করা লাইব্রেরিগুলি সংরক্ষণাগারভুক্ত করার সময় আমি এতে আক্রান্ত হয়েছিলাম। নির্দিষ্ট একটি ক্ষেত্রে কাজটি চালিয়ে যাওয়ার জন্য বিজ্ঞপ্তিযুক্ত গ্রন্থাগারগুলির সাথে সিমলিংকগুলি বেছে নিতে কিছু অতিরিক্ত পার্ল গ্লোব হ্যাকারি ব্যবহার করেছেন।

EDIT2: কমপক্ষে যখন ফাইল এবং inotifywait কমান্ড লাইন (যেমন থেকে নিজেদের symlinks inotifying inotifywait -m file symlinkবা inotifywait symlink file) আউটপুট যা এক (যা নির্বিশেষে কমান্ড লাইনে প্রথম এক্সেস দেখাবে fileএর symlinkঅ্যাক্সেস করা হয়)। ইনোটিফাইয়েট IN_DONT_FOLLOW সমর্থন করে না - যা, যখন আমি প্রোগ্রামগতভাবে চেষ্টা করি তখন একজনকে অ্যাক্সেস দেখায় file(যা প্রত্যাশা করে যা হতে পারে, যা হতে পারে ...) কমান্ড লাইনে অর্ডার নির্বিশেষে


"আমার জন্য এটি আমার নিজের থেকে অনেক কম ম্যাচ দিয়েছে" আপনি কি tracefileকোনও ফাইল অ্যাক্সেস মিস করার উদাহরণ ভাগ করতে পারেন ?
ওলে টাঞ্জ

আপনি ঠিক কী জিজ্ঞাসা করেছেন তা আমি নিশ্চিত নই:) ... আমি যদি / পথ / টু / ট্রেসড / ডিরেক্টরিতে ফাইলগুলি দেখার চেষ্টা করি / আমি আউটপুটটি বেনামে দেখি ... তবে স্ট্যাট (1) ফাইলগুলি আমার মনে হচ্ছে আমি যে কয়েকটি মামলায় চেষ্টা করেছি তার কোনও ফল পেতে (আমি অবাক হয়েছি কেন, কেন কিছু কিছু ক্যাচিং ডিরেক্টরি থেকে পাঠানো ডিরেক্টরী বিষয়বস্তু লুকিয়ে
রাখছে

আমি নীচে ফ্যানোটাইফাই পোস্টটিতে মন্তব্য করছি (আমার কেবল 21 খ্যাতি রয়েছে, যদিও আমার এক দশকেরও বেশি সময় ধরে অ্যাকাউন্ট ছিল; কমেন্ট করার জন্য 50 প্রয়োজন আমার পক্ষে সবসময় বাধা হয়ে দাঁড়িয়েছিল ...) - ফ্যানোটাইফাই ভাল জিনিস, তবে পারে না সিমলিংক ডেরিফারেন্স ইস্যুটি ঘুরে দেখুন (যেমন সিমলিংকের ক্ষেত্রে, চূড়ান্ত ফাইলটি অ্যাক্সেস করা হয়েছে / প্রো / স্ব / এফডি / <এফডি> পড়ার মাধ্যমে পাওয়া যাবে .. যাইহোক +1: উত্তরটি
এনগ করুন

1

যদিও এটি আপনাকে পর্যাপ্ত নিয়ন্ত্রণ না দেয় (এখনও?) আমি একটি প্রোগ্রাম লিখেছি, যা আপনার প্রয়োজনীয়তা কমপক্ষে আংশিকভাবে পূরণ করে, একটি নির্দিষ্ট প্রক্রিয়া এবং তার বাচ্চাদের দ্বারা শুধুমাত্র সংশোধিত ফাইলগুলি (বা পড়ুন) নিরীক্ষণের জন্য লিনাক্স-কার্নেলের ফ্যানোটাইফাই এবং ভাগ না করে ভাগ করা ব্যবহার করে । স্ট্রেসের তুলনায় এটি বেশ দ্রুত (;

এটি https://github.com/tycho-kirchner/shorter এ পাওয়া যাবে

শেলের উপর উদাহরণ:

$ 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    
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.