খোলা থাকলেও মুছে ফেলা বড় ফাইলগুলি সন্ধান এবং সরিয়ে ফেলুন


119

মুছে ফেলা হলেও একটি অ্যাপ্লিকেশনটিতে এখনও খোলা থাকা বড় ফাইলগুলি কীভাবে খুঁজে পাওয়া যায়? প্রক্রিয়াটি খোলা থাকলেও কীভাবে কেউ এই জাতীয় ফাইলটি সরিয়ে ফেলতে পারেন?

পরিস্থিতিটি হ'ল আমরা এমন একটি প্রক্রিয়া চালাচ্ছি যা ভয়ঙ্কর হারে লগ ফাইলটি পূরণ করে। আমি কারণটি জানি, এবং আমি এটি ঠিক করতে পারি। ততক্ষণে, আমি প্রক্রিয়াটি বন্ধ না করে লগ ফাইলটি আরএম বা খালি করতে চাই।

সহজভাবে করা rm output.logফাইলের কেবল রেফারেন্সগুলি সরিয়ে দেয়, তবে প্রক্রিয়াটি শেষ না হওয়া পর্যন্ত এটি ডিস্কে স্থান দখল করতে থাকবে। সবচেয়ে খারাপ: rmআইএনপি করার পরে আমার কাছে এখন আর ফাইলটি কোথায় বা এটি কত বড় তা খুঁজে পাওয়ার কোনও উপায় নেই! এটি অন্য প্রক্রিয়াতে এখনও খোলা থাকা সত্ত্বেও, ফাইলটি খুঁজে পাওয়ার কোনও উপায় আছে এবং সম্ভবত এটি খালি করা আছে?

আমি বিশেষত ডিবিয়ান বা আরএইচইল এর মতো লিনাক্স-ভিত্তিক অপারেটিং সিস্টেমগুলি উল্লেখ করি।


2
আপনি যদি পিডটি জানেন তবে lsof -p <pid>তার খোলার ফাইল এবং তাদের আকারগুলি তালিকাবদ্ধ করতে আপনি ব্যবহার করতে পারেন । মুছে ফেলা ফাইলটির (deleted)পাশে থাকবে । মুছে ফেলা ফাইলটি /proc/<pid>/fd/1সম্ভবত লিঙ্ক করা হবে । আমি জানি না কীভাবে কোনও প্রক্রিয়া এটির ফাইলটি বাদ দিয়ে তার ফাইল বিবরণীতে লেখা বন্ধ করে দেয়। আমি মনে করি যে প্রক্রিয়া উপর নির্ভর করবে।
donothingsuccessfully

ধন্যবাদ। কীভাবে কেউ rmএখনও খোলা থাকা সমস্ত এডি ফাইলগুলির পিআইডি পেতে পারে ?
dotancohen

@ ডোনোথিংসাক্সেসলি লসফ দ্বারা রিপোর্ট করা "মুছে ফেলা" ট্যাগটি সোলারিস নির্দিষ্ট, বাস্তবে সোলারিস 10 বা তার পরেও। ওপি কোন অপারেটিং সিস্টেমটি ব্যবহার করছে তা নির্দিষ্ট করে দেয়নি। @ ডটানকোহেন সোলারিসে আপনি মুছে ফেলা অনুসন্ধানের জন্য lsof এর আউটপুটটি পাইপ করতে পারেন, যেমন lsof | grep "(deleted)"। মুছে ফেলা ফাইলটি উন্মুক্ত করার কোনও প্রক্রিয়া নেই, তখন কার্নেলটি ইনোড এবং ডিস্ক ব্লকগুলি মুক্ত করবে। প্রক্রিয়াগুলিতে "হ্যান্ডলারগুলি" থাকে না যার দ্বারা তাদের জানানো যেতে পারে যে একটি উন্মুক্ত, মূলত লক করা ফাইল, ডিস্ক থেকে সরানো হয়েছে।
জোহান

2
@ জোহান, lsof | grep '(deleted)'লিনাক্সেও কাজ করে। লিনাক্সে, আপনাকে ইনোটাইফাই মেকানিজম (IN_DELETE_SELF ইভেন্ট)
স্টাফেন

আমি somefileএটি ভিআইএম এ তৈরি এবং খোলার পরে rmঅন্য একটি বাশ প্রক্রিয়াতে এটি সম্পাদনা করেছি। আমি তখন চালনা করি lsof | grep somefileএবং এটি সেখানে নেই, যদিও ভিআইএম-তে ফাইল খোলা রয়েছে।
dotancohen

উত্তর:


140

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

এটি কেটে ফেলা:

: > /path/to/the/file.log

যদি এটি ইতিমধ্যে মুছে ফেলা হয়, লিনাক্সে, আপনি এখনও এটি করে কেটে ফেলতে পারেন:

: > "/proc/$pid/fd/$fd"

$pidফাইলটি খোলার প্রক্রিয়াটির প্রক্রিয়া আইডি কোথায় রয়েছে এবং $fdএটির অধীনে এটির একটি ফাইল বর্ণনাকারী খোলে (যা দিয়ে আপনি এটি পরীক্ষা করতে পারেন lsof -p "$pid"

আপনি যদি পিড না জানেন এবং মুছে ফেলা ফাইলগুলি সন্ধান করছেন তবে আপনি এটি করতে পারেন:

lsof -nP | grep '(deleted)'

lsof -nP +L1, যেমন @ user75021 উল্লেখ একটি আরো উন্নত (আরও নির্ভরযোগ্য এবং আরো পোর্টেবল) বিকল্প (তালিকা ফাইল আছে যে এর চেয়ে কম 1 লিংক) হয়।

অথবা (লিনাক্সে):

find /proc/*/fd -ls | grep  '(deleted)'

বা এর সাথে বড়দের সন্ধান করতে zsh:

ls -ld /proc/*/fd/*(-.LM+1l0)

একটি বিকল্প, যদি অ্যাপ্লিকেশনটি গতিশীলভাবে সংযুক্ত থাকে তবে এটির সাথে একটি ডিবাগার যুক্ত করা এবং এটির close(fd)পরে একটি নতুন কল করা হয় open("the-file", ....)


1
আরও একটি truncateস্পষ্টভাবে একই কাজ করে একটি কমান্ড আছে।
টুবু

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

1
@ অলিভিয়ারডুলাক lsofসম্ভবত কোনও বহনযোগ্য সমাধানের সবচেয়ে কাছের হতে চলেছে যা আপনি খোলার ফাইলগুলি তালিকাতে পেতে পারেন। অ্যাপ্লিকেশন পায়ের নীচে fd বন্ধ করতে ডিবাগার পদ্ধতির পাশাপাশি যথেষ্ট পোর্টেবল হওয়া উচিত।
স্টাফেন চেজেলাস

2
@ স্টাফেনচাজেলাস: ধন্যবাদ আমি সমস্ত পার্টিশনের উপর একটি ফাইল খোলা আছে এমন সমস্ত পিআইডি তালিকাভুক্ত করার একটি উপায় খুঁজে পেয়েছি: df -k | awk 'NR>1 { print $NF }' | xargs fuser -Vud (এবং তারপরে অপরাধীদের এফডি ছাড়তে বাধ্য করার জন্য সংকেত পাঠানো সহজ)
অলিভিয়ার ডুলাক

6
আপনি ব্যবহার করতে পারেন lsof +L1। Lsof ম্যান পেজ থেকে: "ফর্মের +L1একটি স্পেসিফিকেশন +aL1 <file_system>মুক্ত লিঙ্কযুক্ত ফাইলগুলি নির্বাচন করবে the ফর্মের একটি স্পেসিফিকেশন নির্দিষ্ট ফাইল সিস্টেমে লিঙ্কযুক্ত মুক্ত ফাইল নির্বাচন করবে।" গ্রিপিংয়ের চেয়ে কিছুটা বেশি নির্ভরযোগ্য হওয়া উচিত।
সিঙ্ক্রো

30

কুইকস্টার্টটি এখানে দেখুন: lsofকুইকস্টার্ট

আমি অবাক হয়েছি কেউ lsof কুইকস্টার্ট ফাইলের উল্লেখ করেনি (lsof সহ অন্তর্ভুক্ত)। "3.a" বিভাগে খোলা, লিঙ্কযুক্ত ফাইলগুলি কীভাবে সন্ধান করতে হবে তা দেখায়:

lsof -a +L1 *mountpoint*

উদাহরণ:

[root@enterprise ~]# lsof -a +L1 /tmp
COMMAND   PID   USER   FD   TYPE DEVICE    SIZE NLINK  NODE NAME
httpd    2357 apache   29u   REG 253,17 3926560     0  1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted)
mysqld   2588  mysql    4u   REG 253,17      52     0  1495 /tmp/ibY0cXCd (deleted)
mysqld   2588  mysql    5u   REG 253,17    1048     0  1496 /tmp/ibOrELhG (deleted)
mysqld   2588  mysql    6u   REG 253,17       0     0  1497 /tmp/ibmDFAW8 (deleted)
mysqld   2588  mysql    7u   REG 253,17       0     0 11387 /tmp/ib2CSACB (deleted)
mysqld   2588  mysql   11u   REG 253,17       0     0 11388 /tmp/ibQpoZ94 (deleted)
httpd    3457   root   29u   REG 253,17 3926560     0  1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted)
httpd    8437 apache   29u   REG 253,17 3926560     0  1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted)
httpd    8438 apache   29u   REG 253,17 3926560     0  1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted)
httpd    8439 apache   29u   REG 253,17 3926560     0  1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted)
httpd    8440 apache   29u   REG 253,17 3926560     0  1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted)
httpd    8441 apache   29u   REG 253,17 3926560     0  1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted)
httpd    8442 apache   29u   REG 253,17 3926560     0  1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted)
httpd    8443 apache   29u   REG 253,17 3926560     0  1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted)
httpd    8444 apache   29u   REG 253,17 3926560     0  1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted)
httpd   16990 apache   29u   REG 253,17 3926560     0  1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted)
httpd   19595 apache   29u   REG 253,17 3926560     0  1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted)
httpd   27495 apache   29u   REG 253,17 3926560     0  1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted)
httpd   28142 apache   29u   REG 253,17 3926560     0  1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted)
httpd   31478 apache   29u   REG 253,17 3926560     0  1499 /tmp/.NSPR-AFM-3457-9820130.0 (deleted)

দ্রুত-প্রারম্ভিক ফাইলটির স্থানীয় অনুলিপি পেতে রেড হ্যাট সিস্টেমে, আমি সাধারণত এটি করি:

[root@enterprise ~]# locate -i quickstart |grep lsof
/usr/share/doc/lsof-4.78/00QUICKSTART

... অথবা এটা:

[root@enterprise ~]# rpm -qd lsof
/usr/share/doc/lsof-4.78/00.README.FIRST
/usr/share/doc/lsof-4.78/00CREDITS
/usr/share/doc/lsof-4.78/00DCACHE
/usr/share/doc/lsof-4.78/00DIALECTS
/usr/share/doc/lsof-4.78/00DIST
/usr/share/doc/lsof-4.78/00FAQ
/usr/share/doc/lsof-4.78/00LSOF-L
/usr/share/doc/lsof-4.78/00MANIFEST
/usr/share/doc/lsof-4.78/00PORTING
/usr/share/doc/lsof-4.78/00QUICKSTART
/usr/share/doc/lsof-4.78/00README
/usr/share/doc/lsof-4.78/00TEST
/usr/share/doc/lsof-4.78/00XCONFIG
/usr/share/man/man8/lsof.8.gz

1

আসলে বরাদ্দ স্থানটি মুক্ত করার জন্য ফাইল সিস্টেম ড্রাইভারের উপর নির্ভর করে এবং কেবলমাত্র তখনই ঘটবে যখন এই ফাইলটি উল্লেখ করে সমস্ত ফাইল বিবরণী প্রকাশ করা হবে। সুতরাং আপনি অ্যাপ্লিকেশনটি ফাইলটি বন্ধ না করে আপনি স্থানটি সত্যই দাবি করতে পারবেন না। যার অর্থ হয় এটি শেষ করে দেওয়া বা এটি একটি ডিবাগারের সাথে "কিছুটা" খেলানো (যেমন ফাইলটি বন্ধ করে দেওয়া এবং এটি আবার খোলা / লেখা হয়নি তা নিশ্চিত করা বা /dev/nullতার পরিবর্তে খোলার )। অথবা আপনি কার্নেলটি হ্যাক করতে পারেন তবে আমি তার বিরুদ্ধে পরামর্শ দেব।

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

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


2
যেহেতু লিনাক্স বেশিরভাগ ফাইল সিস্টেমে স্পার ফাইলগুলিকে সমর্থন করে, আচরণটি সঠিকভাবে সংজ্ঞায়িত হয় এবং ডিস্ক ড্রাইভারটি সত্যই ডিস্কের স্থান মুক্ত করতে পারে। আমি এটি ext3 এবং ext4 এর জন্য পরীক্ষা করেছি এবং এটি স্টিফেনের মতো কাজ করে।
জোফেল

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

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

আপনাকে ধন্যবাদ পিটার আমি আনন্দিত যে আপনি এই পোস্টে "কেন" সম্বোধন করেছেন।
dotancohen

2
যতদূর আমি বলতে পারি, খোলা ফাইলগুলি কেটে নেওয়া এক্সএফএসে স্থান পুনরুদ্ধারও করে। fallocateলিনাক্স ৪.৯-তে বরাদ্দ হওয়া সাধারণ ফাইল এবং ফাইল উভয়ই দিয়ে পরীক্ষা করা হয়েছে । আপনি কি দয়া করে স্পষ্ট করে বলতে পারেন কোন ফাইল সিস্টেম এবং শর্তের অধীনে কোনও ফাইল কেটে নেওয়া স্থান পুনরায় দাবি করে না?
স্টাফেন চেজেলাস 3:58
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.