লিনাক্সে কোন প্রক্রিয়াটির একটি ফাইল খোলা আছে তা আমি কীভাবে নির্ধারণ করতে পারি?


124

আমি কোন প্রক্রিয়াটিতে লক-ফাইলের মালিকানা রয়েছে তা নির্ধারণ করতে চাই। লক-ফাইলগুলি কেবল একটি নির্দিষ্ট নামের একটি ফাইল যা তৈরি করা হয়েছে।

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

উত্তর:


55

আপনি এটির জন্যও ব্যবহার করতে পারেন fuser:

~> less .vimrc
# put in background
~> fuser .vimrc
.vimrc:              28135
~> ps 28135
  PID TTY      STAT   TIME COMMAND
28135 pts/36   T      0:00 less .vimrc

এটি দুর্দান্ত ছিল তবে স্ক্রিপ্টে এটি ব্যবহার করতে আমাকে আউটপুট দৈর্ঘ্য পরীক্ষা করতে হবে।
chovy

আউটপুট দৈর্ঘ্য বলতে কী বোঝ?
নাথান ফেলম্যান

if [ fuser "$ ফাইল" `]; তারপরে প্রস্থান করুন
9:55 এ chovy

1
ফুসারের প্রস্থান কোডগুলির সাথে অদ্ভুত আচরণ রয়েছে। এটি দুটি রাজ্য সহ 1 এক্সপোড প্রদান করে: এ / কিছু অভ্যন্তরীণ ত্রুটি, চেক করা ফাইল পাওয়া যায় না ইত্যাদি, বি / কোনও প্রক্রিয়া নির্দিষ্ট ফাইল খোলেনি। পরিস্থিতিতে এ / আউটপুটে কিছু ত্রুটি বার্তা মুদ্রিত হয়। দুর্ভাগ্যক্রমে যখন ফাইল উপলব্ধ থাকে এবং কোনও কিছু দ্বারা খোলা থাকে, আউটপুট উত্পন্ন হয় তবে প্রস্থান কোড 0 দিয়ে। ফিউজারটি এখনকার মতো দুটি নয়, তিনটি কোড দিয়ে বেরিয়ে আসলে ভাল হয়। lsoft কিছুটা খারাপ সমাধান কারণ এটি আরও ধীরে ধীরে কাজ করছে।
Znik

এটি মূলত একই প্যাটার্ন lsঅনুসরণ করে - এটিতে যদি কোনও ত্রুটি থাকে (যেমন, অবৈধ বিকল্প নির্দিষ্ট করা থাকে) বা ফাইল খুঁজে পাওয়া না যায় তবে এটি প্রস্থান কোড 2 ফেরত দেয় (এবং 0 যদি এটি সফলভাবে তথ্য প্রতিবেদন করে)।
স্কট

144

বেশিরভাগ লিনাক্স সিস্টেমে lsof NAMEকাজটি করা হয়:

fin@r2d2:~$ lsof /home/fin
COMMAND   PID USER   FD   TYPE DEVICE SIZE    NODE NAME
bash    21310  fin  cwd    DIR    8,1 4096 5054467 /home/fin
lsof    21320  fin  cwd    DIR    8,1 4096 5054467 /home/fin
lsof    21321  fin  cwd    DIR    8,1 4096 5054467 /home/fin
fin@r2d2:~$

4
এবং যদি আপনার lsof না থাকে?
জোসেএলসিগুরা

3
@ জোসেলসিগুরা: আমি ধরে নিচ্ছি যে আপনি উত্তরের জন্য পর্যাপ্ত পরিমাণে রিসোর্স 'তারপরে lsof ইনস্টল করুন' আপনার পক্ষে অকেজো হয়ে উঠবে। আপনি কি আপনার সমস্যার বিস্তারিত বলতে পারবেন? আপনার যদি রুট না থাকে তবে সম্ভবত অন্য কোনও ব্যবহারকারী ফাইলটি খোলা আছে কিনা তা খুঁজে পাওয়ার জন্য আপনার ছদ্মবেশ নেই।
মাইকেল শ্যাপার 0

এটি কেবল ডায়ারদের জন্যই ফাইলগুলির জন্য কাজ করছে বলে মনে হচ্ছে না
জেসন

@ জেসন: এটি ফাইলগুলির জন্য কাজ করে তবে cwdলাইনগুলি (যেগুলি কোনও প্রক্রিয়াটির বর্তমান কার্যকরী ডিরেক্টরি হিসাবে ব্যবহার করে) রিপোর্ট করে কেবল ডিরেক্টরিগুলি।
পুনরায় পোস্টার

9

ফাইল খোলা থাকা কোনও লক নয় কারণ, প্রতিটি প্রক্রিয়াটি যদি ফাইলটি প্রথমে খোলা আছে কিনা তা পরীক্ষা করে দেখতে হয় এবং এটি না থাকলে এগিয়ে না যায় বা তৈরি না হয় / না থাকলে তা দুটি প্রক্রিয়া একই সাথে চেক করতে পারে, উভয়ই আবিষ্কার করে এটি খোলেনি, তবে এটি তৈরি বা খুলুন উভয়ই।

লক হিসাবে একটি ফাইল ব্যবহার করতে, চেক এবং লক অপারেশন একটি একক নিরবচ্ছিন্ন অপারেশন হতে হবে। আপনি ইউনিক্স ফাইল সিস্টেমে এটি কেবল পঠনযোগ্য মোডের সাথে একটি ফাইল তৈরি করে এবং আনলক করার জন্য মুছে ফেলাতে এটি অর্জন করতে পারেন। যদি ফাইলটি বিদ্যমান থাকে (এবং কেবল পঠিত হয়) তবে ফাইল তৈরি ব্যর্থ হবে, সুতরাং আপনি একক পরমাণু ক্রিয়াকলাপে চেক-লক পাবেন get

যদি আপনার লকিং প্রক্রিয়াটি একটি শেল স্ক্রিপ্ট হয় যা ডেমন হিসাবে চলমান থাকে তবে আপনি এই umaskপ্রক্রিয়াটি ব্যবহার করতে পারেন , প্রতি-প্রক্রিয়া সেটিং যা নতুন ফাইলগুলি তৈরি করার অনুমতিগুলি সেট করে:

oldumask = $ (umask)
umask 222 # মালিকদের পক্ষেও অলিখিত লিখনযোগ্য ফাইলগুলি তৈরি করুন
যদি প্রতিধ্বনি $$> / var / লক / ফু হয়
তারপর
    : লক করা সফল হয়েছে
আর
    : লক ব্যর্থ হয়েছে
ফাই
umask $ oldumask
এটি নিজস্ব প্রক্রিয়াটি 'পিআইডি ফাইলে লিখবে যা আপনার অন্যান্য সমস্যা সমাধান করে: cat /var/lock/foo
"এই ফাইলটি কোন প্রসেসে খোলা আছে?" সম্পর্কিত সুনির্দিষ্ট প্রশ্নের ক্ষেত্রে, আপনি যখন কোনও ফাইল-সিস্টেম আনমাউন্ট করতে চান তখন এটি কার্যকর হতে পারে তবে কিছু প্রক্রিয়াতে একটি ফাইল খোলা থাকার কারণে এটি করা যায় না। যদি আপনার কাছে এই আদেশগুলি উপলভ্য না থাকে তবে আপনি /procমূল হিসাবে জিজ্ঞাসা করতে পারেন :

ls -l /proc/*/cwd | grep '/var/lock/foo$'

বা, নশ্বর ব্যবহারকারী হিসাবে:

ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'


`ls -l 'পদ্ধতিটি লিনাক্সের জন্য কাজ করে তবে মনে হয় সাইগউইনের পক্ষে কাজ করছে না: ফাইল লক করার কোনও তথ্য নেই। কীভাবে সমাধান করবেন জানেন না? ধন্যবাদ।
সোপালাজো ডি অ্যারিরিজ

না, আপনি কোনও লকের জন্য কেবল পঠনযোগ্য ফাইল তৈরি করেন না কারণ যখন আপনার অ্যাপ্লিকেশনটি ক্রাশ হবে তখন ফাইলটি সেখানেই থাকবে। আপনার ক্র্যাশ হওয়া অ্যাপ্লিকেশনটির পরে ব্যবহারকারীকে ক্র্যাপগুলি পরিষ্কার করতে বাধ্য করা মানসিক।
polkovnikov.ph

6

আপনি যদি জানতে চান যে কোন সঠিক প্রক্রিয়াটির ফাইল বর্ণনাকারী আপনার ফাইলের সাথে lsofবা ছাড়াই লিঙ্ক করে fuser- অনুসন্ধানের মাধ্যমে /proc:

$ find /proc -regex '\/proc\/[0-9]+\/fd\/.*' -type l -lname "*$1*" -printf "%p -> %l\n" 2> /dev/null

$1আপনি যে ওপেন ফাইল নামটি অনুসন্ধান করছেন তা প্রতিস্থাপন করুন । আপনি -printfযা দেখতে চান তার জন্য সংশোধন করতে পারেন, বা সেই প্রক্রিয়াটির তথ্যের egrep -o '[0-9]+' | head -1জন্য ব্যবহারের জন্য পাইপ ।ps -Fp <pid>

@Fin দ্বারা উত্তরটি সবচেয়ে ভালো অবশ্যই হয়, কিন্তু উত্তর দিতে @ JoseLSegura এর মন্তব্য , যদি এই পাওয়া যায় না, উপরোক্ত সমাধান আমার প্রতিক্রিয়া ছিল।$ lsof <filename>


2

আমি দেখতে পেয়েছি যে স্বীকৃত উত্তরটি ব্যবহার করে আমার ডিরেক্টরি ব্যবহার করে এমন প্রক্রিয়াগুলির তালিকা দেওয়া হয়নি (উবুন্টু 14.04)।

শেষ পর্যন্ত, আমি আপত্তিজনক প্রক্রিয়াটি খুঁজে পেতে lsof (ফাইলগুলির তালিকা ওপেন করুন) ব্যবহার করেছি এবং এর ফলাফলকে গ্রেপ করেছি:

lsof | egrep "<regexp-for-your-file>"

এর ব্যবহারের জন্য আরও পরিষ্কার এবং দ্রুততর উপায় lsofহ'ল এটির বিকল্প -R। যেমন: lsof -R [filename]
tron5
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.