Yanıtlar:
En iyi yol, hangi programların / hizmetlerin eski kütüphaneleri kullandığını bulmak ve yeniden başlatmaktır. Ve tüm kullanılmış dosyaları 'lsof' kullanarak listeleyerek ve 'DEL' tipinde olanları bularak başarabilirsiniz. DEL, dosya adının dosya sisteminden kaldırıldığı anlamına gelir, ancak birisi onu kullandığından hala bellekte kalır.
İşte tam komut satırı:
sudo lsof +c 0 | grep 'DEL.*lib' | awk '1 { print $1 ": " $NF }' | sort -u
Yeniden başlatmanın tek zorunlu nedeni yeni bir çekirdeğidir (ve kexec'i kullanarak yeniden başlatabilirsiniz). Ayrıntılar için https://wiki.archlinux.org/index.php/Kexec adresine kısaca bakın:
yeni çekirdeği yükleyin, initramfs ve önyükleme cmdline'ını belirtin
kexec -l /boot/new-kernel --initrd=/boot/new-initramfs --reuse-cmdline
çağırmak kexec ( systemctldüzgün kapatma için kullanın , kexec -edoğrudan yürütür)
systemctl kexec
kexec-load@.serviceWiki'de açıklandığı gibi bir oluşturursanız , yeniden başlatırsanız, bir bios yeniden başlatma yapmak yerine systemdkullanarak otomatik olarak yeniden kexecbaşlatılacağını unutmayın.
Systemd hizmet adları veren biraz geliştirilmiş sürüm:
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
veya tek satırlık:
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
Bazı sorunlar olduğunu unutmayın:
systemctl daemon-reload başka bir şey yeniden başlatılmadan önce yürütülmelidirsystemdkendisi) yeniden başlatılması gerekiyorsa,systemctl daemon-reexecsystemctl restart dbus.service diğer bazı hizmetleri bozarsa, dbus yeniden başlatıldıktan sonra yeniden başlatılması gerekir:
systemd kendisi: systemctl daemon-reexecsystemd-logindsystemd-machineddbussystemctl restart sshd bağlı olduğunuz sürece yeniden başlatmazsanız, 2 seçenek görüyorum:
systemctl restart sshdkullanarakat/cron/systemd zamanlamaSSHgibi başka bir uzak (güvenli) kabuk kullanarak yeniden başlatmoshscreen/tmux, aşağıdaki gibi hizmetleri de engelleyebilirSSH yeniden başlatılmasını , en kolay yol hizmetleri yeniden başlatmadan önce bu oturumları kapatmaktırKolay bir yol, çalışan çekirdeğin sürümünü diskteki en son çekirdeğe kıyasla karşılaştırmaktır. Bir senaryo buldum kolayca yapabilen .
Birkaç çekirdek yüklü olduğundan, yalnızca çalışan çekirdeğe karşılık gelen komut dosyasını denetlemek için komut dosyasını değiştirdim. Örneğin, şu anda yüklü 4.9.79 ve 4.14.16 sürümlerim var ve bu nedenle /boot/vmlinuz-4.14-x86_64'ü kontrol etmem gerekiyor. Ne yazık ki bu, 5.1 sürümünü kullanmaya başladığımda işe yaramayacak, bu yüzden bir güncelleme gerekli (4'e 3 değiştirin) veya daha sağlam bir yol bulmam gerekiyor.
İşte benim senaryom:
#!/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