Come posso verificare dalla riga di comando se è necessario un riavvio su RHEL o CentOS?


40

Sto usando CentOS e Red Hat Enterprise Linux su alcune macchine senza la GUI. Come posso verificare se gli aggiornamenti installati di recente richiedono un riavvio? In Ubuntu, sono abituato a verificare se /var/run/reboot-requiredè presente.

Risposte:


34

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

Non dimenticare che potrebbe essere necessario riavviare a causa degli aggiornamenti della libreria principale, almeno se è glibc. (Inoltre, potrebbe essere necessario riavviare i servizi dopo gli aggiornamenti).

Se si installa il yum-utilspacchetto, è possibile utilizzare un comando chiamato needs-restarting.

Puoi usarlo sia per verificare se è necessario un riavvio completo a causa degli aggiornamenti del kernel o delle librerie core (usando l' -ropzione), sia per quali servizi devono essere riavviati (usando l' -sopzione).

needs-restarting -rrestituisce 0se il riavvio non è necessario e 1, in tal caso, è perfetto da utilizzare in uno script.

Un esempio:

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
Vale la pena ricordare che almeno l' -sopzione richiede l'accesso come root.
Paul Gear,

2
Per Fedora, needs-restartingè un plugin DNF . Non supporta -ro -s(ancora).
Franklin Yu,

30

Informazioni sul confronto dei kernel installati con l'esecuzione di uno:

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

Spero che sia d'aiuto!


2
Inizialmente ho pensato che non funzionasse poiché continuava a dirmi di riavviare dopo che avevo, ma poi ho scoperto che se si utilizza un'istanza di DigitalOcean, è necessario modificare manualmente il kernel dal loro pannello di controllo prima di riavviare.
Programster,

C'è un motivo per cui la kernel-stringa viene rimossa dall'output di rpm -q?
Zlemini,

1
La kernel-stringa deve essere rimossa per confrontarla con l'output di uname -r, che non la contiene.
alexm,

7

È possibile confrontare l'output di uname -a con l'elenco dei pacchetti del kernel installati


2
Un kernel diverso è l'unica ragione per cui un server Linux avrebbe bisogno di un riavvio?
Chris_K,

1
Normalmente, quando ci si attiene ai processi di aggiornamento del pacchetto "normali" (up2date, yum ecc.), Non dovrebbero esserci molte altre ragioni per riavviare il sistema oltre all'aggiornamento del kernel
Dominik

Ho il sospetto che alcuni altri pacchetti potrebbero richiedere un riavvio eben del kernel non cambia (quando ho installato kexec-tools-2.0.0-258 su centos6.0 non c'era memoria riservata per il dump)
nhed

Il pacchetto pbis-open di BeyondTrust richiede all'utente di riavviare dopo l'installazione tramite stdout.
bshacklett,

6

uname -avs. rpm -q kernele needs-restartingdayum-utils


5

Una cosa che può essere utile guardare in termini di "è necessario riavviare" è se ci sono o meno dei file che sono stati rimossi / sostituiti dall'aggiornamento ma per i quali i vecchi file sono ancora caricati / usati dai processi attivi.

Fondamentalmente, quando YUM aggiorna un file utilizzato da un processo, è possibile che il file stesso sia stato contrassegnato per l'eliminazione, ma il processo continua a utilizzare il vecchio file poiché ha un descrittore di file aperto sull'inode del vecchio file.

Un comando per ottenere un conteggio del numero di vecchi file ancora in uso:

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

Questo comando ti darà un conteggio dei file.

Usa questo invece per vedere quali file sono effettivamente in uso:

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

Tale comando produrrà un output simile al seguente in una casella aggiornata 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

Controlla se il kernel in esecuzione è l'ultimo.

In caso contrario, verificare se il sistema è stato riavviato dall'installazione del kernel.

In caso contrario, riavviare.

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

Questo non funziona se hai una versione del kernel abilitata per PAE. Uname -r comamnd restituisce il suffisso PAE dopo la parte .elX ma non i nomi rpm.
Yanick Girouard,

1

So che a questa domanda è già stata data una risposta e che la gente ha pubblicato informazioni sul controllo di kernel più recenti e file eliminati, ma di recente ho scritto uno script che controlla entrambi. Se viene rilevata una delle condizioni, il riavvio è programmato per +30 minuti.

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

Ecco la mia versione del codice alexm. Puoi farlo:

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 controlla in questo posto cosa hanno ottenuto tutti i nuovi rpm

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.