Я використовую CentOS та Red Hat Enterprise Linux на кількох машинах без GUI. Як я можу перевірити, чи потребують перезавантаження нещодавно встановлені оновлення? В Ubuntu я звик перевіряти наявність /var/run/reboot-required
.
Я використовую CentOS та Red Hat Enterprise Linux на кількох машинах без GUI. Як я можу перевірити, чи потребують перезавантаження нещодавно встановлені оновлення? В Ubuntu я звик перевіряти наявність /var/run/reboot-required
.
Відповіді:
https://access.redhat.com/discussions/3106621#comment-1196821
Не забувайте, що вам може знадобитися перезавантажити через оновлення основних бібліотек, принаймні, якщо це glibc. (А також послуги, можливо, доведеться перезапустити після оновлень).
Якщо ви встановите
yum-utils
пакет, ви можете використовувати команду під назвоюneeds-restarting
.Ви можете використовувати його як для перевірки, чи потрібне повне перезавантаження через оновлення ядер або основних бібліотек (використовуючи
-r
параметр), або які сервіси потрібно перезапустити (використовуючи-s
параметр).
needs-restarting -r
повертається,0
якщо перезавантаження не потрібне, і1
якщо воно є, тож його ідеально використовувати в сценарії.Приклад:
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
Про порівняння встановлених ядер із запущеним:
#!/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
Сподіваюся, що це допомагає!
kernel-
рядок видаляється з виводу rpm -q
?
kernel-
Рядок повинен бути видалена , щоб порівняти його з виходом з uname -r
, який не містить його.
Ви можете порівняти вихід Unme -a зі списком встановлених пакетів ядра
Одне, що може бути корисним для розгляду з точки зору "необхідна перезавантаження" - це чи немає файлів, які були видалені / замінені оновленням, але для яких старі файли все ще завантажуються / використовуються активними процесами.
В основному, коли YUM оновлює файл, який використовується процесом, сам файл, можливо, був позначений для видалення, але процес продовжує використовувати старий файл, оскільки він має відкритий дескриптор файлу до входу старого файлу.
Команда отримати підрахунок кількості старих файлів, які ще використовуються:
#lsof | grep "(path inode=.*)" | wc -l
Ця команда дасть вам кількість файлів.
Використовуйте це замість того, щоб побачити, які файли фактично використовуються:
#lsof | grep "(path inode=.*)"
Ця команда видасть результат, подібний до наступного, у вікні, оновленому 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
Перевірте, чи працює ядро останнє.
Якщо ні, перевірте, чи система була перезапущена після встановлення ядра.
Якщо цього не було, перезавантажте.
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
Я знаю, що на це питання вже відповіли, і люди опублікували інформацію про перевірку на новіші ядра, а також видалені файли, але я нещодавно написав сценарій, який перевіряє обидва. Якщо виявлено будь-який стан, перезавантаження заплановане на +30 хвилин.
#!/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}"
-s
параметра потрібен кореневий доступ.