Я использую CentOS и Red Hat Enterprise Linux на нескольких машинах без графического интерфейса. Как проверить, требуется ли перезагрузка недавно установленных обновлений? В 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
Надеюсь, это поможет!
Вы можете сравнить вывод uname -a со списком установленных пакетов ядра
uname -a
vs. rpm -q kernel
и needs-restarting
из yum-utils
Одна вещь, которая может быть полезна с точки зрения «требуется ли перезагрузка», - это наличие или отсутствие файлов, которые были удалены / заменены обновлением, но для которых старые файлы все еще загружаются / используются активными процессами.
По сути, когда 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}"
С момента написания этого ответа я улучшил и обновил скрипт. Он доступен на github здесь: https://github.com/qth/jutil/blob/master/rbc
Вот моя версия кода alexm. Ты можешь сделать это:
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
install.log install.log.syslog yum.log вы проверяете это место, что все получили новые rpm установили