Como posso verificar na linha de comando se uma reinicialização é necessária no RHEL ou CentOS?

40

Estou usando o CentOS e o Red Hat Enterprise Linux em algumas máquinas sem a GUI. Como posso verificar se as atualizações instaladas recentemente exigem uma reinicialização? No Ubuntu, estou acostumado a verificar se /var/run/reboot-requiredestá presente.

Jim Hunziker
fonte

Respostas:

34

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

Não esqueça que você pode precisar reiniciar por causa das atualizações da biblioteca principal, pelo menos se for glibc. (E também, os serviços podem precisar ser reiniciados após as atualizações).

Se você instalar o yum-utilspacote, poderá usar um comando chamado needs-restarting.

Você pode usá-lo para verificar se é necessária uma reinicialização completa devido a atualizações do kernel ou das bibliotecas principais (usando a -ropção) ou quais serviços precisam ser reiniciados (usando a -sopção).

needs-restarting -rretorna 0se a reinicialização não for necessária e, 1se for, será perfeito para usar em um script.

Um exemplo:

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
fonte
1
Vale ressaltar que pelo menos a -sopção requer acesso root.
Paul Gear
2
Para o Fedora, needs-restartingé um plugin DNF . Não suporta -rou -s(ainda).
Franklin Yu
30

Sobre a comparação de kernels instalados com a execução de um:

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

Espero que ajude!

alexm
fonte
2
No começo, pensei que isso não estava funcionando, pois continuava pedindo para reiniciar depois da inicialização, mas depois descobri que se você estiver usando uma instância do DigitalOcean, precisará alterar manualmente o kernel do painel de controle antes de reiniciar.
Programster
Existe uma razão pela qual a kernel-string está sendo removida da saída de rpm -q?
Zlemini
1
A kernel-cadeia deve ser removida para compará-la com a saída de uname -r, que não a contém.
alexm
7

Você pode comparar a produção de uname -a com a lista de pacotes de kernel instalados

Dominik
fonte
2
É um kernel diferente a única razão pela qual um servidor linux precisaria de uma reinicialização?
31510 Chris_K
1
Normalmente, ao permanecer nos processos de atualização de pacotes 'normais' (up2date, yum etc.), não deve haver muitas outras razões para reiniciar o sistema além da atualização do kernel
Dominik
Eu suspeito que certos outros pacotes possam exigir uma reinicialização quando o kernel não muda (quando instalei o kexec-tools-2.0.0-258 no centos6.0, não havia memória reservada para o dump)
encerrado em
O pacote pbis-open do BeyondTrust solicita que o usuário reinicie após a instalação via stdout.
bshacklett
6

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

ptman
fonte
5

Uma coisa que pode ser útil em termos de "é necessária uma reinicialização" é se existem ou não arquivos removidos / substituídos pela atualização, mas para os quais os arquivos antigos ainda são carregados / usados ​​por processos ativos.

Basicamente, quando o YUM atualiza um arquivo em uso por um processo, o próprio arquivo pode ter sido marcado para exclusão, mas o processo continua usando o arquivo antigo, pois possui um descritor de arquivo aberto para o inode do arquivo antigo.

Um comando para obter uma contagem do número de arquivos antigos ainda em uso:

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

Esse comando fornecerá uma contagem dos arquivos.

Use isso para ver quais arquivos estão realmente em uso:

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

Esse comando produzirá uma saída semelhante à seguinte em uma caixa atualizada pelo 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
fonte
2

Verifique se o kernel em execução é o mais recente.

Caso contrário, verifique se o sistema foi reiniciado desde a instalação do kernel.

Caso contrário, reinicie.

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
fonte
Isso não funciona se você tiver uma versão do kernel habilitada para PAE. O uname -r comamnd retorna o sufixo PAE após a parte .elX, mas não os nomes de rpm.
Yanick Girouard 13/13
1

Eu sei que essa pergunta já foi respondida e que as pessoas postaram informações sobre a verificação de kernels mais recentes, além de arquivos excluídos, mas recentemente escrevi um script que verifica as duas. Se qualquer uma das condições for detectada, a reinicialização será agendada para +30 minutos.

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

Aqui está a minha versão do código alexm. Você consegue fazer isso:

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
fonte
-5

install.log install.log.syslog yum.log, você verifica este local, tudo o que tem novo rpm foi instalado

Rajat
fonte