কোনও ফাইল ব্যবহার হচ্ছে কিনা তা পরীক্ষা করার কি আরও দ্রুত উপায় আছে?


8

আমি একটি কমান্ড লাইন ফাংশন বা সি ফাংশন সন্ধান করছি যা কোনও ফাইল খোলা / ব্যবহার করে যদি কিছু ব্যবহার করে তা আমাকে জানতে দেয়।

lsofএবং fuserএটি বলুন, তবে তারা অনেকগুলি অন্যান্য তথ্য সরবরাহ করে যার ফলস্বরূপ কিছু পরিস্থিতিতে 300 মিমি গ্রহণের ফলাফল হয় (যেমন আমি যখন ম্যাক ওএস এক্স এ এই কোডটি ব্যবহার করি তখন আমি লিনাক্স এবং ওএস এক্স এর জন্য প্রস্তুত করছি) (আমার উইন্ডোজ রয়েছে সমাধানটি 5 মিমি লাগে তাই আমি ইউনিক্সে এমন কিছু সন্ধান করার চেষ্টা করছি যা খুব দ্রুততর এবং ফাইলটি ব্যবহার করা হলে কেবল সত্য বা মিথ্যা ফিরিয়ে দেয়)


উত্তর:


9

আপনি যদি এটি লক হিসাবে ব্যবহার করেন তবে এটি কারওর মতো কাজ করবে না lsofবা fuserবর্ণের পরিস্থিতি রোধ করবে না ।

যে প্রাথমিক প্রক্রিয়াটি হয় lsofতা হ'ল /proc/*/fsওপেন ফাইল বর্ণনাকারীদের সন্ধানের সমস্ত প্রক্রিয়াটি ট্রল করা । আপনি যা কিছু করেন না কেন এটি সময় নিচ্ছে।

আপনি নিজে এটি করতে পারেন, তবে আপনার সিস্টেমে প্রতিটি ওপেন প্রক্রিয়া পরীক্ষা করার জন্য এটি কোনও দ্রুত হওয়ার সম্ভাবনা নেই।

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

  • আপনি লিখেছেন এমন কোনও প্রোগ্রামের মাধ্যমে যদি ফাইলটি নিয়ন্ত্রণ করেন; একটি লক ফাইল ব্যবহার করুন।
  • আপনি যদি এমন কোনও কমান্ড চালাচ্ছেন যা ফাইলটিতে পরিচালনা করে, তবে কমান্ড / প্রোগ্রামটি কোন ডকুমেন্টেশন অফার করে তা দেখুন এবং এটি কোনও লকফিল তৈরি করতে পারে না কিনা তা দেখুন। এটি ব্যর্থ হয়ে দেখুন, এটির ভিতরে এটির পিআইডি দিয়ে কোনও ফাইল তৈরি করা যায় না কিনা তা দেখুন। তারপরে /proc/<PID>/fsআপনার ফাইলটি বর্তমানে উন্মুক্ত আছে কিনা তা আপনি সন্ধান করতে পারেন । কেবলমাত্র একটি প্রক্রিয়া দেখলে ওপেন ফাইল বর্ণনাকারী আরও দ্রুত হবে তারপরে সেগুলি জুড়ে ম্যাপিং।
  • অন্যথায় আপনাকে সহায়তা করার জন্য আমি আপনি কী করছেন সে সম্পর্কে আরও তথ্যের প্রয়োজন।

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

উদাহরণস্বরূপ, লিনাক্স-এ, আপনার প্রোগ্রামটি নিম্নলিখিতটি করুন:

  • ~/.mozilla/firefox/ডিরেক্টরি খুলুন ।
  • সমস্ত ডিরেক্টরি তালিকাভুক্ত, ডিরেক্টরিতে অন্তর্ভুক্ত ফিল্টারিং .default। (আমি মনে করি যে সমস্ত প্রোফাইল .defaultকেবলমাত্র প্রতিটি ডিরেক্টরিতে ক্রল না করলে শেষ হয় ))
  • উপরের প্রতিটি ডিরেক্টরির সালে নামের একটি ফাইল অস্তিত্ব জন্য চেহারা lockবা .parentlock। আপনি যদি দুটি বা দুটি ফাইল দেখতে পান তবে ফায়ারফক্স খোলা থাকে।

আপনি বর্তমানে উইন্ডোতে যা করেন তার চেয়ে এই অ্যালগরিদমটির দ্রুত সম্পাদন করা উচিত।


দুর্দান্ত উত্তর আপনাকে ধন্যবাদ। Lsof এবং fuser কে কি কেবল পিড ফোল্ডারটি ফায়ারফক্স হলে তা পরীক্ষা করতে বলুন? এটি ফায়ারফক্সের ফোল্ডার ব্যতীত ফোল্ডারগুলির সমস্ত বিষয়বস্তু এড়িয়ে যাবে (আমার কাছে 3 টি পৃথক দৃষ্টান্ত রয়েছে যার অর্থ এটি ঠিক 3 টি ফোল্ডার চেক করে?)
নয়েটিডার্ট

ফাইলটি লক করা আছে, তবে এটি লক হলে কীভাবে পরীক্ষা করব তা আমি বুঝতে পারছি না। এটি সফলভাবে পড়ার / লেখার জন্য উন্মুক্ত হচ্ছে। তাই অদ্ভুত. আমি সি থেকে এফসিএনটিএল চেষ্টা করেছি তবে এটি সর্বদা ফিরে আসবে -১ :(
Noitidart

3
@ নাইটিডার্ট আপনি সমাধান করার চেষ্টা করছেন এমন আসল সমস্যাটি কী? যে কোনও প্রক্রিয়ার ওপেন ফাইল বর্ণনাকারীদের সন্ধানের জন্য আপনাকে এর পিআইডি জানতে হবে। এটি প্রোগ্রামের প্রতিটি উদাহরণের জন্য পরিবর্তিত হয়। এটি "ম্যানুয়ালি" পাওয়ার সহজ উপায়টি সাথে রয়েছে ps aux firefox। এই পিআইডি নিন এবং সেগুলি /proc/ফাইল সিস্টেমে সন্ধান করুন ।
নিকসাগল

আহ ধন্যবাদ একটি ভাল ধারণা সম্পর্কে ps aux firefox। আমার সঠিক পরিস্থিতিটি হ'ল: আমার কাছে একটি ফাইলের পথ রয়েছে। ফায়ার ফক্স চালু থাকলে এটি লক হয়ে গেছে। আমি দেখতে চাই যে এটি লক হয়েছে কিনা তা না জানাতে ফায়ার ফক্স চালু রয়েছে কিনা।
Noitidart

1
@ নাইটিডার্ট আমি লক ফাইলগুলি দেখে ফায়ার ফক্সকে কীভাবে সনাক্ত করতে হয় তা অন্তর্ভুক্ত করার জন্য আমি আমার মন্তব্য সম্পাদনা করেছি। আপনি সমস্ত সিস্টেমে এই প্রক্রিয়াটি পুনরাবৃত্তি করতে পারেন।
নিক্সেগেল

1

টি এল; ডিআর

ইন আপনার মন্তব্য এক , আপনি রাজ্য:

আমার সঠিক পরিস্থিতিটি হ'ল: আমার কাছে একটি ফাইলের পথ রয়েছে। ফায়ার ফক্স চালু থাকলে এটি লক হয়ে গেছে। আমি দেখতে চাই যে এটি লক হয়েছে কিনা তা না জানাতে ফায়ার ফক্স চালু রয়েছে কিনা।

লকফিলগুলি সম্পর্কে আপনার মূল প্রশ্নটি দীর্ঘ পথের মতো মনে হচ্ছে যখন কোনও প্রদত্ত ব্যবহারকারীর জন্য ফায়ারফক্স চলছে কিনা এবং এটির প্রক্রিয়া অবস্থাটি পরীক্ষা করার জন্য সহজ উপায় রয়েছে ways

প্রক্রিয়া অবস্থা পরীক্ষা করা হয়

একটি প্রদত্ত প্রক্রিয়ার PID, এটি একটি আরো যুক্তিসম্মত উপায় ব্যবহার করা pgrep থেকে procps প্যাকেজ। উদাহরণ স্বরূপ:

$ pgrep -u $LOGNAME firefox
5671

তারপর আপনার সাথে PID, রাজ্যের পরিদর্শন করতে PS :

$ ps 5671
  PID TTY      STAT   TIME COMMAND
 5671 ?        Sl   105:47 /usr/lib/firefox/firefox

বা অন্য কোনও ক্রাফট ছাড়াই রাষ্ট্রীয় পতাকা পান:

$ ps -ho stat $(pgrep -u $LOGNAME firefox)
Sl

আমার একটি সিস্টেম, উপরের ওয়ান-লাইনারে ধারাবাহিকভাবে সম্পূর্ণ হতে কেবল 1.4 মিলিসেকেন্ড সময় নেয়। আপনার মাইলেজ পরিবর্তিত হতে পারে.

প্রক্রিয়া রাষ্ট্র কোড

PS (1) এর প্রসেস স্টেট কোডস বিভাগে বিভিন্ন রাষ্ট্রীয় পতাকাগুলির অর্থ কী তা বিশদ করে। উবুন্টু 14.04-তে ম্যান পেজটি বলেছেন:

PROCESS STATE CODES
       Here are the different values that the s, stat and state output
       specifiers (header "STAT" or "S") will display to describe the state of
       a process:

               D    uninterruptible sleep (usually IO)
               R    running or runnable (on run queue)
               S    interruptible sleep (waiting for an event to complete)
               T    stopped, either by a job control signal or because it is
                    being traced
               W    paging (not valid since the 2.6.xx kernel)
               X    dead (should never be seen)
               Z    defunct ("zombie") process, terminated but not reaped by
                    its parent

       For BSD formats and when the stat keyword is used, additional
       characters may be displayed:

               <    high-priority (not nice to other users)
               N    low-priority (nice to other users)
               L    has pages locked into memory (for real-time and custom IO)
               s    is a session leader
               l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads
                    do)
               +    is in the foreground process group

1
সমস্যাটি হ'ল বর্তমানে এটি জানতে হবে যে বর্তমানে কোন সেশন ফায়ারফক্স রয়েছে lin লিনাক্সে, আপনি কেবল সন্ধান করুন ~/.mozilla/firefox/*/lock। তারপরে আপনি প্রতিটি লক ফাইলের পিতামহিত ডিরেক্টরি নামটি দেখে সেশনটি সনাক্ত করতে পারবেন। অন্যান্য প্ল্যাটফর্মে এটি কাজ করে না। আমাদের চ্যাটটি ম্যাক্সে এটি কীভাবে কাজ করা যায় সে সম্পর্কে আরও বেশি যায় (যা উবুন্টুর পক্ষে অপ্রাসঙ্গিক তবে এটি আপনার কাছে আছে)। ন্যায়সঙ্গত হওয়ার জন্য, প্রশ্নটি আরও সুনির্দিষ্ট হওয়ার জন্য তাঁর সত্যই আপডেট করা উচিত। : পি
নিক্সেগেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.