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
( systemctl
düzgün kapatma için kullanın , kexec -e
doğrudan yürütür)
systemctl kexec
kexec-load@.service
Wiki'de açıklandığı gibi bir oluşturursanız , yeniden başlatırsanız, bir bios yeniden başlatma yapmak yerine systemd
kullanarak otomatik olarak yeniden kexec
baş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ülmelidirsystemd
kendisi) yeniden başlatılması gerekiyorsa,systemctl daemon-reexec
systemctl restart dbus.service
diğer bazı hizmetleri bozarsa, dbus yeniden başlatıldıktan sonra yeniden başlatılması gerekir:
systemd
kendisi: systemctl daemon-reexec
systemd-logind
systemd-machined
dbus
systemctl restart sshd
bağlı olduğunuz sürece yeniden başlatmazsanız, 2 seçenek görüyorum:
systemctl restart sshd
kullanarakat/cron/systemd
zamanlamaSSH
gibi başka bir uzak (güvenli) kabuk kullanarak yeniden başlatmosh
screen/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