উত্তর:
সর্বোত্তম উপায় হ'ল কোন প্রোগ্রাম / পরিষেবাগুলি পুরানো লাইব্রেরি ব্যবহার করে এবং সেগুলি পুনরায় চালু করে। এবং আপনি 'lsof' ব্যবহার করে সমস্ত ব্যবহৃত ফাইল তালিকাভুক্ত করে এবং 'ডেল' টাইপযুক্ত ফাইলগুলি আবিষ্কার করে এটি অর্জন করতে পারেন। দিল্ল মানে ফাইল সিস্টেম থেকে ফাইলের নামটি সরানো হয়েছে তবে এটি এখনও মেমরিতে আটকে আছে কারণ কেউ এটি ব্যবহার করে।
সম্পূর্ণ কমান্ড লাইন এখানে:
sudo lsof +c 0 | grep 'DEL.*lib' | awk '1 { print $1 ": " $NF }' | sort -u
রিবুট করার একমাত্র বাধ্যতামূলক কারণটি হল একটি নতুন কার্নেল (এবং আপনি কেেক্সেক ব্যবহার করে নরম-রিবুট করতে পারেন)। সংক্ষেপে, বিশদগুলির জন্য https://wiki.archlinux.org/index.php/Kexec দেখুন :
নতুন কার্নেল, initramfs লোড করুন এবং বুট cmdline নির্দিষ্ট করুন
kexec -l /boot/new-kernel --initrd=/boot/new-initramfs --reuse-cmdline
প্রার্থনা kexec( systemctlসঠিক শাটডাউন জন্য ব্যবহার , kexec -eসরাসরি চালানো হবে)
systemctl kexec
মনে রাখবেন যে আপনি যদি kexec-load@.serviceউইকিতে বর্ণিত হিসাবে তৈরি করেন, যদি আপনি পুনরায় বুট করেন তবে একটি বায়োস রিবুট করার পরিবর্তে systemdস্বয়ংক্রিয়ভাবে নরম-রিবুট kexecহবে
সামান্য বিট উন্নত সংস্করণ যা সিস্টেমেড পরিষেবার নাম দেয়:
PIDS="(lsof +c0 -n 2> /dev/null | grep 'DEL.*lib' | awk '{print $2}' | sort -u)"
for PID in $PIDS; do
systemctl status $i
done | grep '●' | awk '{print $2}' | sort -u
বা এক-লাইন:
for i in $(lsof +c0 -n 2> /dev/null | grep 'DEL.*lib' | awk '{print $2}' | sort -u); do systemctl status $i; done | grep '●' | awk '{print $2}' | sort -u
লক্ষ্য করুন যে কিছু সমস্যা রয়েছে:
systemctl daemon-reload অন্য কিছু শুরু করার আগে মৃত্যুদন্ড কার্যকর করা উচিতsystemdনিজেই) পুনরায় চালু করা দরকার হয় তবে এটি ব্যবহার করে করা যেতে পারেsystemctl daemon-reexecsystemctl restart dbus.service কিছু অন্যান্য পরিষেবা ভঙ্গ করে, তাদের ডিবিাস পুনরায় চালু করার পরে পুনরায় চালু করা দরকার:
systemd নিজেই: systemctl daemon-reexecsystemd-logindsystemd-machineddbussystemctl restart sshdযতক্ষণ আপনি সংযুক্ত থাকবেন ততক্ষণ এটি পুনরায় আরম্ভ করবেন না, আমি 2 টি বিকল্প দেখতে পাচ্ছি:
systemctl restart sshdব্যবহার করে সময়সূচীat/cron/systemdSSHঅন্য রিমোট (সুরক্ষিত) শেল ব্যবহার করে পুনরায় চালু করুনmoshscreen/tmuxপরিষেবাগুলিতেও অবরুদ্ধ হতে পারে SSH, সহজতম উপায় হ'ল পরিষেবাগুলি পুনরায় চালু করার আগে এই সেশনগুলি বন্ধ করাএকটি সহজ উপায় হ'ল চলমান কার্নেলের সংস্করণটিকে ডিস্কের সর্বশেষ কার্নেলের সাথে তুলনা করা। আমি এমন একটি স্ক্রিপ্ট পেয়েছি যা সহজেই তা করতে পারে।
যেহেতু আমার বেশ কয়েকটি কার্নেল ইনস্টল করা আছে, আমি চলমান কার্নেলের সাথে সম্পর্কিত একটিকে পরীক্ষা করতে স্ক্রিপ্টটি পরিবর্তন করেছি। উদাহরণস্বরূপ, বর্তমানে আমার কাছে 4.9.79 এবং 4.14.16 সংস্করণ ইনস্টল করা আছে এবং এইভাবে /boot/vmlinuz-4.14-x86_64 পরীক্ষা করা দরকার। দুর্ভাগ্যক্রমে এটি কাজ করবে না যখন আমি সংস্করণ 5.1 ব্যবহার করা শুরু করব, সুতরাং একটি আপডেটের প্রয়োজন হবে (4 দ্বারা 3 দ্বারা প্রতিস্থাপন করুন) অথবা আমার আরও শক্তিশালী উপায় খুঁজে বের করতে হবে।
আমার লিপিটি এখানে:
#!/bin/sh
NEXTLINE=0
FIND=""
CURRENT_KERNEL=`uname -r`
KERNEL_PATH="/boot/vmlinuz-${CURRENT_KERNEL:0:4}"
for I in `file $KERNEL_PATH*`; do
if [ ${NEXTLINE} -eq 1 ]; then
FIND="${I}"
NEXTLINE=0
else
if [ "${I}" = "version" ]; then NEXTLINE=1; fi
fi
done
if [ ! "${FIND}" = "" ]; then
if [ ! "${CURRENT_KERNEL}" = "${FIND}" ]; then
echo "Boot required"
else echo "No boot required"
fi
fi