Saya menggunakan CentOS dan Red Hat Enterprise Linux pada beberapa mesin tanpa GUI. Bagaimana saya dapat memeriksa apakah pembaruan yang baru diinstal memerlukan reboot? Di Ubuntu, saya sudah terbiasa memeriksa apakah /var/run/reboot-required
ada.
Saya menggunakan CentOS dan Red Hat Enterprise Linux pada beberapa mesin tanpa GUI. Bagaimana saya dapat memeriksa apakah pembaruan yang baru diinstal memerlukan reboot? Di Ubuntu, saya sudah terbiasa memeriksa apakah /var/run/reboot-required
ada.
Jawaban:
https://access.redhat.com/discussions/3106621#comment-1196821
Jangan lupa bahwa Anda mungkin harus mem-boot ulang karena pembaruan perpustakaan inti, setidaknya jika itu glibc. (Dan juga, layanan mungkin perlu direstart setelah pembaruan).
Jika Anda menginstal
yum-utils
paket, Anda dapat menggunakan perintah yang disebutneeds-restarting
.Anda dapat menggunakannya untuk memeriksa apakah reboot penuh diperlukan karena pembaruan kernel atau core libraries (menggunakan
-r
opsi), atau layanan apa yang perlu direstart (menggunakan-s
opsi).
needs-restarting -r
kembali0
jika reboot tidak diperlukan, dan1
jika perlu, jadi sangat cocok untuk digunakan dalam skrip.Sebuah contoh:
root@server1:~> needs-restarting -r ; echo $?
Core libraries or services have been updated:
openssl-libs -> 1:1.0.1e-60.el7_3.1
systemd -> 219-30.el7_3.9
Reboot is required to ensure that your system benefits from these updates.
More information:
https://access.redhat.com/solutions/27943
1
Tentang membandingkan kernel yang diinstal dengan menjalankan kernel:
#!/bin/bash
LAST_KERNEL=$(rpm -q --last kernel | perl -pe 's/^kernel-(\S+).*/$1/' | head -1)
CURRENT_KERNEL=$(uname -r)
test $LAST_KERNEL = $CURRENT_KERNEL || echo REBOOT
Semoga itu bisa membantu!
kernel-
string dihapus dari output rpm -q
?
kernel-
String harus dikeluarkan untuk membandingkannya dengan output dari uname -r
, yang tidak mengandung itu.
Anda dapat membandingkan ouput uname -a dengan daftar paket kernel yang diinstal
Satu hal yang dapat membantu untuk dilihat dalam hal "adalah reboot diperlukan" adalah apakah ada file yang telah dihapus / diganti oleh pembaruan tetapi file lama masih dimuat / digunakan oleh proses aktif.
Pada dasarnya, ketika YUM memperbarui file yang digunakan oleh suatu proses, file itu sendiri mungkin telah ditandai untuk dihapus, tetapi proses terus menggunakan file lama karena memiliki file-deskriptor terbuka untuk inode file lama.
Perintah untuk menghitung jumlah file lama yang masih digunakan:
#lsof | grep "(path inode=.*)" | wc -l
Perintah itu akan memberi Anda hitungan file.
Gunakan ini sebagai gantinya untuk melihat file mana yang sebenarnya digunakan:
#lsof | grep "(path inode=.*)"
Perintah itu akan menghasilkan keluaran yang serupa dengan yang berikut pada kotak yang diperbarui YUM:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 3782 root mem REG 8,17 153427 /lib64/libcrypto.so.0.9.8e (path inode=153253)
mysqld 3883 mysql mem REG 8,17 153259 /lib64/libcrypt-2.5.so (path inode=153402)
mingetty 4107 root mem REG 8,17 153243 /lib64/libc-2.5.so (path inode=153222)
...
etc
Periksa apakah kernel yang berjalan adalah yang terbaru.
Jika tidak, periksa apakah sistem telah dimulai ulang sejak instalasi kernel.
Jika tidak, reboot.
CURRENT_KERNEL="$(rpm -q kernel-$(uname -r))"
test -z "$CURRENT_KERNEL" && exit 0 # Current kernel is a custom kernel
LATEST_KERNEL="$(rpm -q kernel | tail -1)"
test -z "$LATEST_KERNEL" && exit 0 # No kernel package installed
LATEST_KERNEL_INSTALLTIME=$(rpm -q kernel --qf "%{INSTALLTIME}\n" | tail -1)
test -z "$LATEST_KERNEL_INSTALLTIME" && exit 1 # Error reading INSTALLTIME
test "$CURRENT_KERNEL" = "$LATEST_KERNEL" && exit 0 # Latest kernel running, no reboot needed
BOOTTIME="$(sed -n '/^btime /s///p' /proc/stat)"
test -z "$BOOTTIME" && exit 1 # Error reading BOOTTIME
test "$LATEST_KERNEL_INSTALLTIME" -lt "$BOOTTIME" && exit 1 # Latest kernel not running, but system was restarted already
# User switched back to an old kernel?
echo reboot
Saya tahu pertanyaan ini sudah dijawab dan orang-orang telah memposting informasi tentang memeriksa kernel yang lebih baru serta file yang dihapus, tetapi saya baru-baru ini menulis sebuah skrip yang memeriksa keduanya. Jika salah satu kondisi terdeteksi, reboot dijadwalkan +30 menit.
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
NEW_KERN=0
DEAD_FILES=0
die () {
printf "Error, exiting: "
echo $@
exit 1
}
for X in lsof wc column awk rpm sed head uname dd tr cut date logger shutdown; do
which "${X}" >/dev/null 2>&1 || die "required application ${X} not found"
done
DATEY="$(date +%Y%m%d-%H%M%S)"
TMPFILE=/tmp/"$(dd if=/dev/urandom bs=1 count=256 2>/dev/null |tr -c -d '0-9a-f' |cut -c-7)"
[ $TMPFILE == "/tmp/" ] && die
echo "### Reboot automation notice: ${DATEY} ###" > "${TMPFILE}"
lsof +c0 -d DEL | grep -v '\s/SYSV' |awk 'NR==1 || !/dev\/zero/ {print $2,$1,$4,$NF}' | column -t >> "${TMPFILE}"
if [ $(cat ${TMPFILE} |wc -l) -gt 2 ]; then
DEAD_FILES=1
else
echo "### Reboot automation notice: ${DATEY} ###" > "${TMPFILE}"
fi
C_KERN="kernel-$(uname -r)"
A_KERN="$(rpm -q --last kernel |head -1 |sed 's|\s\+.*$||')"
[ $A_KERN != $C_KERN ] && NEW_KERN=1 && printf "Running $C_KERN, but $A_KERN available\n" >> "${TMPFILE}"
echo "### End of reboot automation notice: ${DATEY} ###" >> "${TMPFILE}"
if [[ $DEAD_FILES -eq 0 && $NEW_KERN -eq 0 ]]; then
echo reboot not required
else
logger -t rebooter -p auth.warning -f "${TMPFILE}"
[ $DEAD_FILES -ne 0 ] && echo " Processes running with broken links to executables,"
[ $NEW_KERN -ne 0 ] && echo " New kernel available,"
echo Reboot is required
shutdown -r +30 "System reboot is required. To cancel use shutdown -c. But don't because this system needs to be rebooted"
fi
[ -f "${TMPFILE}" ] && rm -f "${TMPFILE}"
Ini adalah versi saya dari kode alexm. Kamu bisa melakukan ini:
LAST_KERNEL=$(rpm -q --last kernel | perl -pe 's/^kernel-(\S+).*/$1/' | head -1)
CURRENT_KERNEL=$(uname -r)
if [ $LAST_KERNEL != $CURRENT_KERNEL ]
then
echo "It is time to Reboot!"
else
echo "There is nothing to do!"
fi
-s
opsi membutuhkan akses root.