ফাইল অপসারণের পরে লিনাক্সে ডিএফ সঠিক ফাঁকা জায়গা দেখাচ্ছে না


143

আমার কাছে ফাইল সার্ভার রয়েছে যা ফাইল সঞ্চয় করার জন্য ব্যবহৃত হয়। ফাইলগুলি এক সপ্তাহ বা এক বছরের জন্য সেখানে থাকতে পারে। দুর্ভাগ্যক্রমে, যখন আমি সার্ভার থেকে ফাইলগুলি সরিয়ে ফেলি, dfকমান্ডটি খালি স্থানটিকে প্রতিফলিত করে না। সুতরাং শেষ পর্যন্ত, সার্ভারটি পূর্ণ হয়ে যায় ( df99% দেখায়) এবং আমার স্ক্রিপ্ট সেখানে আর কোনও ফাইল প্রেরণ করে না, সেখানে কয়েক ডজন গিগাবাইট খালি জায়গা থাকতে পারে।

noatimeযদি কোনও পার্থক্য হয় তবে আমি মাউন্ট করা পার্টিশনে ফ্ল্যাগ পেয়েছি ।


এটি কি একক পার্টিশনে বা সমস্ত পার্টিশনে ঘটছে?
খালেদ

ঠিক আছে, এটি আমার প্রধান ডেটা পার্টিশনে ঘটছে, যা কেবলমাত্র আমিই যত্ন করি, যেহেতু আমি কেবল এটিতে ফাইল লিখি / সরান।

সমাধান, বা একটি লিঙ্ক দিয়ে আমাকে আলোকিত করুন।

কোন ফাইল সিস্টেম (গুলি)? ডিএফ সুপারব্লকের একটি স্ট্যাটাস করে, এটি হতে পারে যে আপনার ফাইল সিস্টেমটি এসবি ইনোড আপডেট করছে না। আপনি কি ক্যাশে ফ্লাশ করার চেষ্টা করেছেন?
মটরশুটি

Ext4 ব্যবহার করে। আপনি কিভাবে ক্যাশ ফ্লাশ করবেন?

উত্তর:


235

ফাইলের নাম মুছে ফেলা আসলে ফাইলটি মুছবে না। অন্য কিছু প্রক্রিয়া ফাইলটি উন্মুক্ত করে রেখেছে, যার ফলে এটি মুছে ফেলা হচ্ছে না; ফাইলটি প্রকাশের জন্য সেই প্রক্রিয়াটি পুনরায় চালু করুন বা হত্যা করুন।

ব্যবহার

lsof +L1

কোন প্রক্রিয়া মুছে ফেলা (লিঙ্কযুক্ত) ফাইল ব্যবহার করছে তা সন্ধান করার জন্য।


2
মুছে ফেলা ফাইলগুলি এক মাসেরও বেশি সময় অ্যাক্সেস করা যায়নি এবং কেবলমাত্র যে প্রক্রিয়াগুলি এগুলি অ্যাক্সেস করে তা হ'ল এনজিনেক্স, সুতরাং এটি সন্দেহজনক।

39
+1 টি। এছাড়াও, "lsof + L1" আপনাকে জানাবে যে কোন প্রোগ্রামটি ফাইলগুলি খোলা রয়েছে।
pehrs

4
"lsof -n | গ্রেপ ফাইল" রুট হিসাবে চালানো, আপনি যে কোনও কারণেই এগুলি উন্মুক্ত রাখার প্রক্রিয়াগুলির কারণে ফাইলগুলি কতক্ষণ আটকে থাকতে পারে তা অবাক করে দিয়েছিলেন। যদি অন্য সমস্ত কিছু ব্যর্থ হয়, পুনরায় বুট করুন তবে এটির প্রস্তাব দিতে আমার খারাপ লাগছে তবে এটি অবশ্যই নিশ্চিত করবে যে কোনও কিছুই ফাইলটিতে রয়েছে না। পিয়ার্স, lsof + L1 সম্ভবত আরও ভাল উপায়।
স্কটজ

3
তুমি আমাকে বাঁচিয়েছ! একটি 93 জি লগ ফাইল মোছা হয়েছে এবং স্থানটি ফিরে পেল না এবং কেন কাজ করতে পারে না। ধন্যবাদ।
লুক কাজিন্স

1
একই লাইনের সাথে এবং এটি অন্যকে সহায়তা করার ক্ষেত্রে, আমি একটি বড় এনগিনেক্স অ্যাক্সেস.লগ ফাইলটি মুছে ফেলেছিলাম তবে কেবল এনগিনেক্স পুনরায় চালু করার পরে স্থানটি পুনরায় দাবি করতে সক্ষম হয়েছিল: পরিষেবা এনজিনেক্স পুনঃসূচনা
নিক

27

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

তবুও, আপনি প্রক্রিয়াগুলি না মেরে স্থানটি পুনরায় দাবি করতে পারেন। আপনাকে যা করতে হবে তা হ'ল ফাইল বর্ণনাকারী সরানো।

প্রথমে চালিত করুন lsof | ফাইলটি ধারণ করে প্রক্রিয়াটি সনাক্ত করতে গ্রেপ মোছা হয়েছে

[hudson@opsynxvm0055 log]$ /usr/sbin/lsof |grep deleted
java       8859   hudson    1w      REG              253,0 3662503356    7578206 /crucible/data/current/var/log/fisheye.out (deleted)

তারপরে কার্যকর করুন:

cd /proc/PID/fd

তারপর

[hudson@opsynxvm0055 fd]$ ls -l |grep deleted
total 0
l-wx------ 1 hudson devel 64 Feb  7 11:48 1 -> /crucible/data/current/var/log/fisheye.out (deleted)

"1" ফাইল বর্ণনাকারী হবে। সেই স্থানটি পুনরায় দাবি করতে এখন "> এফডি" টাইপ করুন

> 1

যদি ফাইলটি ধরে রাখার অন্যান্য প্রক্রিয়াগুলি থাকে তবে আপনাকে অপারেশনটির পুনরাবৃত্তি করতে হবে।


1
কি করে > FD?
মাস

এটি ফাইল বর্ণনাকারীটিকে সরিয়ে দেয়
অ্যাড্রিয়েন ডেকিকো

2
এই >আদেশের একটি নাম আছে? আমি এটি ব্যবহার করতে সক্ষম হতে zsh থেকে bash এ স্যুইচ করতে হয়েছিল। এটি কি zsh এ চালানো সম্ভব?
আরিরা

1
এটি একটি আউটপুট পুনর্নির্দেশ এবং সুতরাং ফাইলটি কেটে ফেলা হয়। দীর্ঘ হতে হবে "প্রতিধ্বনি> 1" বা "সত্য> 1"। এটি সত্যিই এফডি সরায় না, এটি কেবল পরে একটি খালি ফাইলের দিকে নির্দেশ করে।
8:58

8

একটি সম্ভাবনা হ'ল আপনি মুছে ফেলা ফাইল (গুলি) ফাইল সিস্টেমে আরও রেফারেন্স রয়েছে। যদি আপনি হার্ডলিঙ্কগুলি তৈরি করে থাকেন তবে বেশ কয়েকটি ফাইলের নাম একই ডেটাতে নির্দেশ করবে এবং সমস্ত তথ্য মুছে ফেলা না হওয়া অবধি ডেটা (প্রকৃত বিষয়বস্তু) বিনামূল্যে / ব্যবহারযোগ্য হিসাবে চিহ্নিত করা হবে না। আপনি ফাইলগুলি মুছে ফেলার আগে, সেগুলি স্থির করুন (লিঙ্কগুলির নামযুক্ত এন্ট্রি) বা তাদের উপর ls -l করুন (দ্বিতীয় কলাম হওয়া উচিত)।

যদি ফাইলগুলি অন্য কোথাও উল্লেখ করা হয় তবে আমার ধারণা, আপনাকে ইনোড নম্বরটি খুঁজে পেতে ফাইল (গুলি) করতে হবে এবং তারপরে সন্ধান করতে -inum <inode-number> দিয়ে একটি অনুসন্ধান করতে হবে এই ফাইলটির অন্যান্য উল্লেখ (আপনি সম্ভবত একই ফাইল সিস্টেমের মধ্যে থাকতে-মাউন্টও ব্যবহার করতে চান)।


4

প্রক্রিয়াটি খোলার পরেও ফাইলটি লক করা আছে। স্থান খালি করার জন্য, এই পদক্ষেপগুলি করুন:

  1. sudo lsof | grep deletedকোন প্রক্রিয়াটি ফাইলটি ধারণ করছে তা চালান এবং দেখুন। উদাহরণ ফলাফল:

    $ sudo lsof | grep deleted
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
    cron     1623 root    5u   REG   0,21        0 395919638 /tmp/tmpfPagTZ4 (deleted)
    
  2. ব্যবহার করে প্রক্রিয়াটি মেরে ফেলুন sudo kill -9 {PID}। উপরের নমুনায়, পিআইডি 1623 হয় 23

    $ sudo kill -9 1623
    
  3. চালান dfযদি স্থান ইতিমধ্যে আপ মুক্তি পেয়েছে বার করো। এটি এখনও পূর্ণ হলে, আপনাকে কয়েক সেকেন্ড অপেক্ষা করতে হবে এবং আবার চেক করতে হবে।


4

পার্টিশনটি কেবলমাত্র রুট ব্যবহারের জন্য ডিস্ক জায়গার নির্দিষ্ট অংশ সংরক্ষণ করার জন্য কনফিগার করা থাকলে, dfএই স্থানটি উপলব্ধ হিসাবে অন্তর্ভুক্ত করবে না।

[root@server]# df -h
Filesystem            Size  Used Avail Use% Mounted on
...
/dev/optvol           625G  607G     0 100% /opt
...

ফাইল / ডিরেক্টরি মুছে ফেলার মাধ্যমে স্থান পুনরুদ্ধার করার পরেও, অ-রুট ব্যবহারকারী নির্দিষ্ট পার্টিশনে লিখতে পারবেন না।

রুট এবং নন-রুট ব্যবহারকারী হিসাবে কোনও ডিভাইসে কোনও ফাইল তৈরি করার চেষ্টা করে আপনি সহজেই এটি পরীক্ষা করতে পারেন।

অতিরিক্তভাবে আপনি চালিয়ে ফাইল সিস্টেম কনফিগারেশন পরীক্ষা করতে পারেন

tune2fs -l <device> | egrep "Block count|Reserved block count

এবং আপনার নিজের থেকে প্রকৃত% গণনা করা হচ্ছে।

রুট-কেবল ব্যবহারের জন্য সংরক্ষিত ডিস্ক% পরিবর্তন করতে, কার্যকর করুন

tune2fs -m <percentage> <device>

1

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

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

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


1

যেহেতু আমি জানি যে আপনার মধ্যে একটি টন /varএফএস সঙ্কুচিত হওয়ার প্রত্যাশী ফাইলগুলি রেডহ্যাট ইন করতে এবং গিজিপিংয়ের জন্য করছেন , তবে পরিবর্তে এটি বৃদ্ধি পাবে, কেবল সিসলগ পুনরায় চালু করার বিষয়টি নিশ্চিত করুন। এবং

lsof -v file

যাইহোক আপনি এই প্রদর্শন করবে।


1
এটি আসলে খুব বেশি যোগ করে না; গৃহীত উত্তর 2001 এর পিছনে যুক্তিটি coveredেকে দেয় you আপনার যখন 50 জন প্রতিনিধি রয়েছে, আপনি বিদ্যমান উত্তরের জন্য বাছাই করতে চাইলে মন্তব্যগুলি ব্যবহার করুন।
অ্যান্ড্রু বি

0

আরও একটি বিকল্প: ডিস্কটি এমন প্রক্রিয়াটির কারণে পূর্ণ হতে পারে যা ধারাবাহিকভাবে ডেটা তৈরি করে: লগ, কোর এবং এর মতো। এটা সম্ভব যে স্থানটি প্রকৃতপক্ষে মুক্ত হচ্ছে তবে তত্ক্ষণাত পূর্ণ হয়ে গেছে। আমি আসলে এই ধরনের একটি মামলা দেখেছি। dfএই ক্ষেত্রে কেবল গর্তের চিত্র দেয় না। duআরও শিখতে ব্যবহার করুন ।


0

আমি এক্সটি 2 ব্যবহার করছি, এফএসসিকে এই পরিস্থিতিতে আমাকে সহায়তা করেছে। কিছুটা পুনরায় আরম্ভ এবং fscks পরে এখন shudown -F চেষ্টা করুন, আমি অর্ধ ব্যবহৃত স্থান দেখতে পাচ্ছি।


1
প্রিয় মার্সেলাস, আপনার সমাধান গৃহীত উত্তর দ্বারা অন্তর্ভুক্ত রয়েছে; এবং কখনও কখনও আপনি রিবুট করতে চান না যদি আপনাকে বাধ্য না করা হয় ...
হরিণ হান্টার

-1

কোন মুছে ফেলা ফাইলগুলি মেমরি দখল করেছে তা পরীক্ষা করতে কমান্ডটি প্রবেশ করুন

 $ sudo lsof | grep deleted

এটি মুছে ফেলা ফাইলগুলিকে প্রদর্শন করবে যা মেমরি ধারণ করে।

তারপরে পিড বা নাম দিয়ে প্রক্রিয়াটি মেরে ফেলুন

$ sudo kill <pid>
$ df -h

এখনই চেক করুন আপনার একই স্মৃতি থাকবে

কোন ফাইলটি মেমরি দখল করে আছে তা দেখতে নীচের কমান্ডটি টাইপ না করে

# cd /
# du --threshold=(SIZE)

কোনও আকার উল্লেখ করুন এটি দেখায় যে কোন ফাইলগুলি প্রান্তিক আকারের উপরে রয়েছে এবং ফাইলটি মুছে ফেলবে যা আপনি মেমরি ধরে রাখতে পারবেন


-4

ওপেন টার্মিনালটি এই কমান্ডটি ডিএফ-টি চেষ্টা করুন পরবর্তী কমান্ডটি sudo du -h --max-গভীরতা = 1 / ব্যবহার করুন আপনি এই কমান্ডটিতে ডিস্ক ব্যবহারের বিশদটি পাবেন এবং তারপরে রুট ব্যবহারকারী হিসাবে ফাইলটি মুছে ফেলা হবে (রুট-লোকাল-শেয়ার-ট্র্যাশ) এবং আপনার ফাইল মুছুন

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