Как я могу проверить из командной строки, требуется ли перезагрузка на RHEL или CentOS?

40

Я использую CentOS и Red Hat Enterprise Linux на нескольких машинах без графического интерфейса. Как я могу проверить, требуют ли перезагрузки недавно установленные обновления? В Ubuntu я привык проверять наличие /var/run/reboot-required.

Джим Хунзикер
источник

Ответы:

34

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
xddsg
источник
1
Стоит отметить, что, по крайней мере, -sопция требует root-доступа.
Пол Гир
2
Для Fedora, needs-restartingэто плагин DNF . Это не поддерживает -rили -s(пока).
Франклин Ю
30

О сравнении установленных ядер с запущенным:

#!/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

Надеюсь, это поможет!

AlexM
источник
2
Сначала я подумал, что это не работает, так как он продолжал говорить мне о перезагрузке после того, как я это сделал, но потом обнаружил, что если вы используете экземпляр DigitalOcean, вам необходимо вручную изменить ядро ​​с панели управления перед перезагрузкой.
Программист
Есть ли причина, по которой kernel-строка удаляется из вывода rpm -q?
Злемини
1
kernel-Строка должна быть удалена , чтобы сравнить его с выходом из uname -r, который не содержит его.
Алекс
7

Вы можете сравнить вывод uname -a со списком установленных пакетов ядра

Dominik
источник
2
Является ли другое ядро ​​единственной причиной, по которой Linux-серверу потребуется перезагрузка?
Chris_K
1
Обычно, оставаясь в «нормальных» процессах обновления пакетов (up2date, yum и т. Д.), Не должно быть действительно много других причин для перезагрузки системы, кроме обновления ядра
Dominik
Я подозреваю, что для некоторых других пакетов может потребоваться перезагрузка, хотя ядро ​​не меняется (когда я установил kexec-tools-2.0.0-258 на centos6.0, памяти для дампов не было)
nhed
Пакет BeyondTrust pbis-open просит пользователя перезагрузиться после установки через стандартный вывод.
bshacklett
6

uname -aпротив rpm -q kernelи needs-restartingотyum-utils

ptman
источник
5

Одна вещь, которая может быть полезна в терминах «требуется перезагрузка», - это наличие файлов, которые были удалены / заменены обновлением, но для которых старые файлы все еще загружаются / используются активными процессами.

По сути, когда YUM обновляет файл, который используется процессом, сам файл, возможно, был помечен для удаления, но процесс продолжает использовать старый файл, поскольку у него есть открытый дескриптор файла для inode старого файла.

Команда для подсчета количества старых файлов, которые все еще используются:

#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
GrangerX
источник
2

Проверьте, является ли работающее ядро ​​самым последним.

Если это не так, проверьте, была ли система перезапущена после установки ядра.

Если это не так, перезагрузите компьютер.

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
Николас Мелай
источник
Это не работает, если у вас есть версия ядра с поддержкой PAE. Uname -r comamnd возвращает суффикс PAE после части .elX, но не имена rpm.
Яник Жируард
1

Я знаю, что на этот вопрос уже дан ответ, и что люди опубликовали информацию о проверке новых ядер, а также удаленных файлов, но недавно я написал скрипт, который проверяет оба. Если обнаруживается какое-либо условие, перезагрузка запланирована на +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}"
Liczyrzepa
источник
1

Вот моя версия кода 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
Дрема
источник
-5

install.log install.log.syslog yum.log вы проверите это место, что все получили новые rpm получили установить

Раджу
источник