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 systemctluntuk shutdown yang tepat, kexec -eakan dieksekusi langsung)
systemctl kexec
Perhatikan bahwa jika Anda membuat kexec-load@.serviceseperti yang dijelaskan dalam wiki, jika Anda reboot, systemdakan secara otomatis soft-reboot menggunakan kexecdaripada 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 lainsystemdsendiri) perlu di-restart, itu bisa dilakukan menggunakansystemctl daemon-reexecsystemctl restart dbus.service istirahat beberapa layanan lain, mereka harus di-restart setelah dbus restart:
systemd diri: systemctl daemon-reexecsystemd-logindsystemd-machineddbussystemctl restart sshdtidak akan memulai kembali selama Anda terhubung, saya melihat 2 opsi:
systemctl restart sshdmenggunakan at/cron/systemdtimerSSHmenggunakan shell remote (aman) lain sepertimoshscreen/tmuxjuga dapat memblokir layanan seperti SSHdari 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