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.