যদি কোনও ফাইল মুছে ফেলা হয়েছে তবে এখনও খোলা থাকে, তার অর্থ এই ফাইলটি এখনও ফাইল সিস্টেমে বিদ্যমান রয়েছে (এটির একটি ইনোড রয়েছে ) তবে একটি হার্ড লিঙ্ক গণনা রয়েছে ০. যেহেতু ফাইলটির কোনও লিঙ্ক নেই, আপনি নামটি খুলতে পারবেন না cannot । ইনোড দিয়ে ফাইল খোলার কোনও সুবিধা নেই।
ফাইলটি সিস্টেমের মাধ্যমে ফাইলটি আবিষ্কার করার কোনও উপায় নেই এবং বিশেষত ডিরেক্টরিটি যেখানে ছিল সেখানে অনুসন্ধানের কোনও উপায় নেই last ডিরেক্টরি এন্ট্রি চলে গেছে। যা যা রয়ে গেছে তা ফাইল নিজেই। আপনি একটি ফাইল সিস্টেম ডিবাগার দিয়ে ফাইলটিতে যেতে পারেন তবে এর জন্য রুট অনুমতি দরকার এবং এটি ব্যবহার করা শক্ত এবং ত্রুটি-প্রবণ।
লিনাক্সের অধীনে বিশেষ প্রতীকী লিঙ্কগুলির মাধ্যমে খোলা ফাইলগুলি উন্মুক্ত করে /proc
। এই লিঙ্কগুলিকে বলা হয় /proc/12345/fd/42
যেখানে 12345 কোনও প্রক্রিয়ার পিআইডি এবং 42 প্রক্রিয়াটির একটি ফাইল বর্ণনাকারীর সংখ্যা । সেই প্রক্রিয়াটির মতো একই ব্যবহারকারী হিসাবে চলমান একটি প্রোগ্রাম ফাইলটি অ্যাক্সেস করতে পারে (পড়ার / লেখার / সম্পাদনের অনুমতিগুলি ফাইলটি মুছে ফেলার সময় আপনার মতো ছিল)।
নাম যার অধীনে ফাইল খোলা হয় এখনও সিম্বলিক লিঙ্ক লক্ষ্য দৃশ্যমান: যদি ফাইল ছিল /var/log/apache/foo.log
, তারপর লিংক লক্ষ্য /var/log/apache/foo.log (deleted)
। (ফাইলটি খোলার পরে যদি নামটির নামকরণ করা হয়, তবে সিমলিংকের টার্গেটটি নাম পরিবর্তন করতে পারে))
সুতরাং আপনি কোনও প্রসেসের পিআইডি এবং এটি যেভাবে খোলা হয়েছে তার বিবরণ দিয়ে একটি খোলা মুছে ফেলা ফাইলের সামগ্রী পুনরুদ্ধার করতে পারবেন:
recover_open_deleted_file () {
old_name=$(readlink "$1")
case "$old_name" in
*' (deleted)')
old_name=${old_name%' (deleted)'}
if [ -e "$old_name" ]; then
new_name=$(TMPDIR=${old_name%/*} mktemp)
echo "$oldname has been replaced, recovering content to $new_name"
else
new_name="$old_name"
fi
cat <"$1" >"$new_name";;
*) echo "File is not deleted, doing nothing";;
esac
}
recover_open_deleted_file "/proc/$pid/fd/$fd"
আপনি যদি কেবল প্রক্রিয়া আইডিটি জানেন তবে বর্ণনাকারী না, আপনি সমস্ত ফাইল পুনরুদ্ধার করতে পারেন
for x in /proc/$pid/fd/*; do
recover_open_deleted_file "$x"
done
আপনি যদি প্রক্রিয়া আইডিটি না জানেন তবে আপনি সমস্ত প্রক্রিয়াগুলির মধ্যে অনুসন্ধান করতে পারেন:
for x in /proc/[1-9]*/fd/*; do
case $(readlink "$x") in
/var/log/apache/*) recover_open_deleted_file "$x";;
esac
done
আপনি এই তালিকাটি আউটপুট বিশ্লেষণ করেও অর্জন করতে পারেন lsof
তবে এটি সহজ বা নির্ভরযোগ্য বা আরও বহনযোগ্য নয় (এটি কোনওভাবে লিনাক্স-নির্দিষ্ট))
lsof / | awk '(/deleted/||/abc.txt/) {print "FD :-",$4,"| File Name:-",$9}'