Jak mogę sprawdzić z wiersza poleceń, czy wymagane jest ponowne uruchomienie na RHEL lub CentOS?

40

Używam CentOS i Red Hat Enterprise Linux na kilku komputerach bez GUI. Jak mogę sprawdzić, czy ostatnio zainstalowane aktualizacje wymagają ponownego uruchomienia? W Ubuntu jestem przyzwyczajony do sprawdzania, czy /var/run/reboot-requiredjest obecny.

Jim Hunziker
źródło

Odpowiedzi:

34

https://access.redhat.com/discussions/3106621#comment-1196821

Nie zapominaj, że może być konieczne ponowne uruchomienie z powodu aktualizacji podstawowej biblioteki, przynajmniej jeśli jest to glibc. (A także usługi mogą wymagać ponownego uruchomienia po aktualizacji).

Jeśli zainstalujesz yum-utilspakiet, możesz użyć polecenia o nazwie needs-restarting.

Możesz użyć go zarówno do sprawdzenia, czy wymagane jest pełne ponowne uruchomienie z powodu aktualizacji jądra lub bibliotek podstawowych (przy użyciu -ropcji), lub jakie usługi należy zrestartować (przy użyciu -sopcji).

needs-restarting -rzwraca, 0jeśli ponowne uruchomienie nie jest potrzebne, a 1jeśli tak, to idealnie nadaje się do użycia w skrypcie.

Przykład:

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
źródło
1
Warto wspomnieć, że przynajmniej -sopcja wymaga dostępu do konta root.
Paul Gear
2
Dla Fedory needs-restartingjest wtyczką DNF . Nie obsługuje -rlub -s(jeszcze).
Franklin Yu
30

Informacje na temat porównywania zainstalowanych jąder z uruchomionym jednym:

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

Mam nadzieję, że to pomaga!

alexm
źródło
2
Na początku myślałem, że to nie działa, ponieważ nadal kazało mi się zrestartować po tym, ale potem dowiedziałem się, że jeśli używasz instancji DigitalOcean, musisz ręcznie zmienić jądro z panelu sterowania przed ponownym uruchomieniem.
Programster
Czy istnieje powód, dla którego kernel-ciąg jest usuwany z wyjścia rpm -q?
Zlemini,
1
kernel-Ciąg musi być usunięty, aby porównać ją z wyjściem z uname -r, który nie zawiera go.
alexm
7

Możesz porównać wyjście uname -a z listą zainstalowanych pakietów jądra

Dominik
źródło
2
Czy inne jądro to jedyny powód, dla którego serwer Linux powinien potrzebować ponownego uruchomienia?
Chris_K,
1
Zwykle, pozostając w ramach „normalnych” procesów aktualizacji pakietu (aktualizacja2, data, mniam itp.), Nie powinno być naprawdę wielu innych powodów do restartowania systemu poza aktualizacją jądra
Dominik
Podejrzewam, że niektóre inne pakiety mogą wymagać ponownego uruchomienia eben, ponieważ jądro się nie zmienia (kiedy zainstalowałem kexec-tools-2.0.0-258 na centos6.0, nie było pamięci zarezerwowanej dla zrzutu)
nd
Pakiet pbis-open BeyondTrust prosi użytkownika o ponowne uruchomienie po instalacji przez stdout.
bshacklett,
6

uname -akontra rpm -q kerneli needs-restartingodyum-utils

ptman
źródło
5

Jedną z rzeczy, na które warto spojrzeć w kategoriach „wymagany jest restart”, jest to, czy istnieją jakieś pliki, które zostały usunięte / zastąpione przez aktualizację, ale dla których stare pliki są nadal ładowane / wykorzystywane przez aktywne procesy.

Zasadniczo, gdy YUM aktualizuje plik używany przez proces, sam plik mógł zostać oznaczony do usunięcia, ale proces nadal używa starego pliku, ponieważ ma otwarty deskryptor pliku dla i-węzła starego pliku.

Polecenie uzyskania liczby nadal używanych starych plików:

#lsof | grep "(path inode=.*)" | wc -l

To polecenie da ci liczbę plików.

Użyj tego zamiast tego, aby zobaczyć, które pliki są aktualnie używane:

#lsof | grep "(path inode=.*)"

To polecenie wygeneruje dane wyjściowe podobne do następujących w polu zaktualizowanym przez 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
źródło
2

Sprawdź, czy uruchomione jądro jest najnowsze.

Jeśli nie, sprawdź, czy system został zrestartowany od czasu instalacji jądra.

Jeśli nie, uruchom ponownie komputer.

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
Nicolas Melay
źródło
To nie działa, jeśli masz wersję jądra z włączonym PAE. Komenda uname -r zwraca sufiks PAE po części .elX, ale nie nazwy rpm.
Yanick Girouard,
1

Wiem, że na to pytanie już udzielono odpowiedzi i że ludzie opublikowali informacje na temat sprawdzania nowych jąder, a także usuniętych plików, ale niedawno napisałem skrypt, który sprawdza oba. Jeśli zostanie wykryty którykolwiek z warunków, ponowne uruchomienie zaplanowane jest na +30 minut.

#!/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
źródło
1

Oto moja wersja kodu alexm. Możesz to zrobić:

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
Sandman
źródło
-5

install.log install.log.syslog mniam.log sprawdzasz to miejsce, co wszystkie nowe rpm mają zainstalowane

Rajat
źródło