ডিরেক্টরি মুছে ফেলা হলে `ls` ত্রুটি


13

আমার দুটি খোল খোলা আছে। প্রথমটি ডিরেক্টরি এ তে রয়েছে দ্বিতীয়টিতে, আমি ডিরেক্টরি A সরিয়ে ফেলি এবং তারপরে এটি পুনরায় তৈরি করি। আমি যখন প্রথম শেলটিতে ফিরে যাই এবং টাইপ করি lsতখন আউটপুটটি হয়:

ls: cannot open directory .: Stale file handle

কেন? আমি ভেবেছিলাম প্রথম শেলটি (যেটি অস্তিত্বহীন ডিরেক্টরিতে খোলা ছিল) পরবর্তী কমান্ডের জন্য অপেক্ষা করার সময় "হিমশীতল" হয়ে যাবে, এবং ডিরেক্টরিটি মুছে ফেলা এবং পুনরায় তৈরি করার বিষয়টি "উপলব্ধি" করতে পারত না। শেলটি কি স্ট্রিং ব্যতীত তার বর্তমান ওয়ার্কিং ডিরেক্টরিতে "গভীর" রেফারেন্স ধারণ করে $PWD?


2
একটি উত্তর নেই, তবে আপনি যদি নিজের শেলটি এর পায়ে ফিরে পড়তে চান তবে আপনি দৌড়াতে পারবেন cd $PWD
ধাগ

আমি কী চলছে তা বুঝতে চাই, আমি জানি শেলটি ফিরে পাওয়া সহজ :)
ফোনিণী

এই ডিরেক্টরিটি কোনও এনএফএস সার্ভারে রয়েছে? আমি মনে করি এটিই একমাত্র পরিস্থিতি যেখানে আপনি বাসি ফাইল হ্যান্ডলগুলি পান।
বারমার

ডিরেক্টরি স্থানীয়। আপনি যখন আপনার সিস্টেমে এটি করেন, ফলাফলটি ভিন্ন হয়?
ফোনিণী

উত্তর:


17

একটি ডিরেক্টরি (যে কোনও ফাইলের মতো) এর নাম দ্বারা সংজ্ঞায়িত হয় না। ডিরেক্টরিটির ঠিকানা হিসাবে নামটি ভাবেন । আপনি যখন ডিরেক্টরিটি সরান, এটি এখনও একই ডিরেক্টরি, যেমন আপনি অন্য কোনও বাড়িতে চলে যান, আপনি এখনও একই ব্যক্তি। আপনি যদি কোনও ডিরেক্টরি মুছে ফেলে এবং একই নামে একটি নতুন তৈরি করেন তবে এটি একটি নতুন ডিরেক্টরি, যেমন আপনি যে বাড়িতে বাস করতেন সে বাড়িতে movesুকে যাওয়ার মতো আপনিই নন।

প্রতিটি প্রক্রিয়া একটি কার্যকরী ডিরেক্টরি আছেcdশেল কমান্ড শেল এর সাম্প্রতিক কাজ করা পরিবর্তন। pwdকমান্ড বর্তমান কাজ ডিরেক্টরিতে the¹ পথ ছাপে।

আপনি যখন ডিরেক্টরি A সরিয়ে ফেলেন, এটি যা করেছিল তা হ'ল এটির মূল ডিরেক্টরিতে এ এর ​​জন্য এন্ট্রি মুছে ফেলা। ডিরেক্টরি A নিজেই ফাইল সিস্টেমে থেকে গেছে তবে কোনও নাম ছাড়াই বিচ্ছিন্ন অবস্থায় রয়েছে। এটি এখনও মুছে ফেলা হয়নি কারণ এটি একটি প্রক্রিয়া দ্বারা ব্যবহৃত হয়েছিল, যথা প্রথম শেল। আপনি যখন প্রথম শেলের ডিরেক্টরিটি পরিবর্তন করেছিলেন, শেষ পর্যন্ত ডিরেক্টরিটি মুছে ফেলা হয়েছিল। প্রক্রিয়াটি খোলার সময় কোনও ফাইল মুছলে মুছলে একই জিনিস ঘটে: ফাইলটির ডিরেক্টরি এন্ট্রি তত্ক্ষণাত অপসারণ করা হয় এবং ফাইলটি ব্যবহার বন্ধ হয়ে গেলে ফাইলটি নিজেই সরিয়ে ফেলা হয়।

একইভাবে, আপনি যখন ডিরেক্টরিগুলি ঘুরে দেখেন তখন কী ঘটে তা পর্যবেক্ষণ করুন।

mkdir one two
touch one/1 two/2
cd one
ls

অন্য শেলের মধ্যে:

mv one tmp
mv two one
mv tmp two

প্রথম শেলের মধ্যে:

ls

ফাইলটি 1সেই ডিরেক্টরিতে রয়েছে যা মূলত বলা হয়েছিল oneএবং এখন বলা হয় two। ফাইলটি 2সেই ডিরেক্টরিতে রয়েছে যা মূলত বলা হয়েছিল twoএবং এখন বলা হয় one

¹ আরও স্পষ্টভাবে, একটি পাথ, যা প্রতীকী লিঙ্কগুলি বা অন্যান্য সূক্ষ্মতা জড়িত থাকলে অনন্য হতে পারে না।


সুতরাং এখানে মূল বক্তব্যটি হ'ল কোনও প্রক্রিয়াটি কেবল তার পথনির্দেশক নয় বরং তার কার্যকরী ডিরেক্টরিটির ইনোড ধারণ করে?
নচট - মনিকা পুনরায় ইনস্টল করুন 15'15

1
@ নাচ প্রক্রিয়াটিতে একটি বিবরণী রয়েছে, তবে কার্নেলটি সমস্ত ম্যাপিং করে (বর্ণনাকারী / ফাইল সারণী এন্ট্রি / ইনোড)। এবং প্রকৃতপক্ষে, অভ্যন্তরীণভাবে, কার্নেলটি পাথগুলি সংরক্ষণ করে না (কারণ আকর্ষণীয় জিনিসগুলি ইনোডে রয়েছে, পাথ নয়)। তদ্ব্যতীত, একটি "পথ" কেবল একটি ফাইলের সাথে একটি লিঙ্ক ... সেখানে বেশ কয়েকটি থাকতে পারে :)
জন ডাব্লু ডাব্লু স্মিথ

ওহ ঠিক আছে এটি একটি বর্ণনা আছে। সুতরাং বাশ ক্রমাগত ওয়ার্কিং ডিরেক্টরি একটি এফডি রাখে? নিশ্চয় না সকল প্রক্রিয়ার কাজ ডিরেক্টরি fds নেই ... আমি fds মনে পরে stdin / আউট / মাত্রই ভুল করে মান 3 থেকে শুরু
পুনর্বহাল মনিকা - Nacht

2
@ নাচ বর্তমান ডিরেক্টরিটি কোনও ফাইল বর্ণনাকারী নয়, তবে এটির মতো অনেক কাজ করে। কার্নেল প্রতিটি প্রক্রিয়ার জন্য এটি বজায় রাখে। লিনাক্সে, আপনি এটি দেখতে পাবেন /proc/<pid>/cwd, যা কাজ করে /proc/<pid>/fd/<number>। এটি এর CWDআউটপুট মধ্যে lsof
গিলস 16 '

cd - && cd -এই ক্ষেত্রে স্বয়ংক্রিয় করা সম্ভব ?
ভাইটালি জাদানেভিচ

8

নতুন ডিরেক্টরি এ ডিরেক্টরি এ-এর মতো নয় তবে statপুরানোটি মুছে ফেলার আগে এবং নতুন তৈরি করার আগে কমান্ড দিয়ে পরীক্ষা করা যায় এবং আপনি বিভিন্ন আই-নোড নম্বর দেখতে পাবেন।
এবং আমি মনে করি এটি কার্নেল কীভাবে কাজ করে তার সাথে সম্পর্কিত। এটি প্রতিটি প্রক্রিয়াটির জন্য কেবল বর্তমান ডিরেক্টরিটির আই-নম্বরটি ট্র্যাক করে। বিভিন্ন আই-নম্বর রয়েছে তাই এটি বিভিন্ন সংঘর্ষের দিকে পরিচালিত করবে।


এটি লক্ষ করা উচিত যে একটি ইনোড একটি কাঠামো, কোনও অনন্য সংখ্যা নয়। এটি অনন্যরূপে চিহ্নিত করা যেতে পারে তবে এটির আইডির চেয়ে বেশি তথ্য রয়েছে। এটিই লিঙ্কগুলির চেয়ে এটি আরও গুরুত্বপূর্ণ করে তোলে।
জন ডব্লিউ এইচ স্মিথ

1
@ জন ডাব্লুএইচএসমিথ আমি এই উত্তরটি মুছে ফেলতে যাচ্ছি গিলস এর চেয়ে ভাল।
ট্যালিজিন

6
এটি আপনার মুছার কোনও কারণ নেই! আপনি যদি সেভাবে অনুভব করেন তবে আপনি কেবল নিজের উত্তরে একটি অস্বীকৃতি যুক্ত করতে পারবেন যাতে আপনি অন্যটিকে আরও ভাল বলে বিবেচনা করেন।
টেরডন

7

এটি প্রত্যাশিত আচরণ। নতুন ডিরেক্টরি এ পুরানো ডিরেক্টরি এ এর ​​মতো নয়, কেবল একই নামটি ঘটে। সুতরাং প্রথম টার্মিনালের $ পিডাব্লুডি এখনও চলে গেছে, আপনি যখন করেছিলেন তখন এটি যাদুকরভাবে পুনরায় প্রদর্শিত হবে না mkdir A


2
আপনি 'নতুন ডিরেক্টরি এ' পুরানো ডিরেক্টরি 'এ' এর মতো নয় isn't ফাইল / ডিরেক্টরি পরিবর্তনের কোন দিকগুলি? এটি কি ইনোড নম্বর দিয়ে করতে হবে? জিজ্ঞাসা করার জন্য দুঃখিত, কিন্তু আমি এই সম্পর্কে শিখছি।
রাহুল

2
@ রহুল দার্শনিকভাবে, তার পরিচয় কী পরিবর্তন করে - একই জায়গায় কিছুই থেকে একটি নতুন ডিরেক্টরি তৈরি করা হয়েছে। একটি বাস্তবায়নের স্তরে, হ্যাঁ, সমস্ত উন্মুক্ত ফাইলগুলি ইনোড দ্বারা চিহ্নিত করা হয়েছে এবং পুরানো এবং নতুন ডিরেক্টরিগুলিতে আলাদা আলাদা ইনোড সংখ্যার সাথে আলাদা আলাদা ইনোড থাকবে।
হাবস

0

একটি ডিরেক্টরি, যেমন একটি ফাইল, এর সাথে একটি ইনোড যুক্ত থাকে:

307% এমকেডির এবিসি

308% ls -i 11997708 এ 11997709 বি 11997710 সি

একটি ইনোড একটি ডেটা স্ট্রাকচার যা ডিরেক্টরি বা ফাইল সম্পর্কে তথ্য ধারণ করে। প্রতিটি ডিরেক্টরি এবং ফাইলের একটি থাকে। এটিকে ঠিকানা হিসাবে ভাবেন (সত্যিকার অর্থে একটি সূচক নম্বর)।

আমি যদি এ, ইনোড নম্বর 11997708 এবং অন্য শেলের মধ্যে (বা একই শেলটিতে যাচ্ছি) মুছে ফেলা ডিরেক্টরিটি এটিকে পুনরায় তৈরি করুন এবং ইনোডটি এলএস করুন:

309% সিডি এ

310% rmdir ../A

311% এমকিডির .. / এ

312% ls -i ..

11997720 এ 11997709 বি 11997710 সি

আই নোডটি আলাদা, সুতরাং এটি যদি মুছে ফেলা ডিরেক্টরি A তে একটি ফাইল তৈরি করার চেষ্টা করে:

313% এটি স্পর্শ করুন

স্পর্শ: 'এটি' টাচ করতে পারে না: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই

কারণ আমি যে ডিরেক্টরিতে আছি - সেটি এখন আর ইনড 11997720 এর সাথে সম্পর্কিত নয় - সুতরাং যেখানে আমি বর্তমানে আছি তার বৈধ ঠিকানা / সূচি - ইনড নেই। এইভাবে ত্রুটি।

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