Jawaban:
Cara terbaik adalah menemukan program / layanan apa yang menggunakan pustaka lama dan memulai kembali. Dan Anda dapat mencapainya dengan mendaftar semua file yang digunakan menggunakan 'lsof' dan menemukan mereka yang memiliki tipe 'DEL'. DEL berarti nama file telah dihapus dari sistem file tetapi masih terjebak dalam memori karena seseorang menggunakannya.
Inilah baris perintah lengkap:
sudo lsof +c 0 | grep 'DEL.*lib' | awk '1 { print $1 ": " $NF }' | sort -u
Satu-satunya alasan wajib untuk reboot adalah kernel baru (dan Anda dapat melakukan soft-reboot menggunakan kexec). Lihat https://wiki.archlinux.org/index.php/Kexec untuk detailnya, singkatnya:
memuat kernel baru, initramfs dan tentukan cmdline boot
kexec -l /boot/new-kernel --initrd=/boot/new-initramfs --reuse-cmdline
invoke kexec
(gunakan systemctl
untuk shutdown yang tepat, kexec -e
akan dieksekusi langsung)
systemctl kexec
Perhatikan bahwa jika Anda membuat kexec-load@.service
seperti yang dijelaskan dalam wiki, jika Anda reboot, systemd
akan secara otomatis soft-reboot menggunakan kexec
daripada melakukan reboot BIOS
Versi sedikit ditingkatkan yang memberikan nama layanan systemd:
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
atau satu baris:
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
Perhatikan bahwa ada beberapa masalah:
systemctl daemon-reload
harus dieksekusi sebelum memulai kembali yang lainsystemd
sendiri) perlu di-restart, itu bisa dilakukan menggunakansystemctl daemon-reexec
systemctl restart dbus.service
istirahat beberapa layanan lain, mereka harus di-restart setelah dbus restart:
systemd
diri: systemctl daemon-reexec
systemd-logind
systemd-machined
dbus
systemctl restart sshd
tidak akan memulai kembali selama Anda terhubung, saya melihat 2 opsi:
systemctl restart sshd
menggunakan at/cron/systemd
timerSSH
menggunakan shell remote (aman) lain sepertimosh
screen/tmux
juga dapat memblokir layanan seperti SSH
dari memulai kembali, cara termudah adalah dengan menutup sesi ini sebelum memulai kembali layananCara yang mudah adalah membandingkan versi kernel yang berjalan dengan kernel terbaru pada disk. Saya menemukan skrip yang dapat melakukannya dengan mudah.
Karena saya memiliki beberapa kernel yang diinstal, saya memodifikasi skrip untuk memeriksa hanya satu yang sesuai dengan kernel yang sedang berjalan. Sebagai contoh, saat ini saya memiliki versi 4.9.79 dan 4.14.16 yang diinstal dan karenanya perlu memeriksa / boot / vmlinuz-4.14-x86_64. Sayangnya ini tidak akan berfungsi ketika saya mulai menggunakan versi 5.1, jadi pembaruan akan diperlukan (ganti 4 dengan 3) atau saya perlu menemukan cara yang lebih kuat.
Ini skrip saya:
#!/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