Як я можу перевірити з командного рядка, чи потрібна перезавантаження на RHEL або CentOS?


40

Я використовую CentOS та Red Hat Enterprise Linux на кількох машинах без GUI. Як я можу перевірити, чи потребують перезавантаження нещодавно встановлені оновлення? В 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

1
Варто згадати, що принаймні для цього -sпараметра потрібен кореневий доступ.
Пол Гір

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

Сподіваюся, що це допомагає!


2
Спочатку я подумав, що це не працює, оскільки продовжував говорити мені про перезавантаження після того, як я мав, але потім з’ясував, що якщо ви використовуєте екземпляр DigitalOcean, вам потрібно вручну змінити ядро ​​з їх панелі управління перед перезавантаженням.
Programster

Чи є причина, чому kernel-рядок видаляється з виводу rpm -q?
Злеміні

1
kernel-Рядок повинен бути видалена , щоб порівняти його з виходом з uname -r, який не містить його.
alexm

7

Ви можете порівняти вихід Unme -a зі списком встановлених пакетів ядра


2
Чи є інше ядро ​​єдиною причиною, коли Linux-серверу потрібна перезавантаження?
Chris_K

1
Зазвичай, перебуваючи в "нормальних" процесах оновлення пакету (up2date, yum тощо), не повинно бути дійсно багато інших причин перезавантажувати систему, окрім оновлення ядра
Домінік

Я підозрюю, що деякі інші пакети можуть вимагати перезавантаження eben, якщо ядро ​​не змінюється (коли я встановив kexec-tools-2.0.0-258 на centos6.0, для дампа не було запам’ятовано пам’яті)
nhed

Пакет pbis-open, відкритий BeyondTrust, вимагає від користувача перезавантажитись після встановлення через stdout.
bshacklett


5

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

В основному, коли 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

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. Команда unme -r повертає суфікс 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}"

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 Ви перевіряєте це місце, що всі нові оберти отримали встановити

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.