जवाबों:
सबसे अच्छा तरीका यह है कि पुराने पुस्तकालयों को किन कार्यक्रमों / सेवाओं का उपयोग करें और उन्हें पुनः आरंभ करें। और आप 'lsof' का उपयोग करके सभी उपयोग की गई फ़ाइलों को सूचीबद्ध करके इसे प्राप्त कर सकते हैं और उन लोगों को खोज सकते हैं जिनके पास 'DEL' प्रकार है। DEL का मतलब फ़ाइलनाम को फ़ाइल सिस्टम से हटा दिया गया था लेकिन यह अभी भी मेमोरी में अटका हुआ है क्योंकि कोई इसका उपयोग करता है।
यहाँ पूरी कमांड लाइन है:
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 कुछ अन्य सेवाओं को तोड़ता है, उन्हें dbus पुनरारंभ के बाद फिर से शुरू करने की आवश्यकता होती है:
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