RHEL 또는 CentOS에서 재부팅이 필요한 경우 명령 줄에서 어떻게 확인할 수 있습니까?


39

GUI가없는 일부 시스템에서 CentOS 및 Red Hat Enterprise Linux를 사용하고 있습니다. 최근에 설치된 업데이트에 재부팅이 필요한지 어떻게 확인할 수 있습니까? 우분투에서는 /var/run/reboot-required존재 여부를 확인하는 데 익숙합니다 .

답변:


33

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

코어 라이브러리 업데이트로 인해 최소한 glibc 인 경우 재부팅해야 할 수도 있습니다. 또한 업데이트 후 서비스를 다시 시작해야 할 수도 있습니다.

yum-utils패키지 를 설치하면 라는 명령을 사용할 수 있습니다 needs-restarting.

커널 또는 코어 라이브러리 업데이트 ( -r옵션 사용)로 인해 전체 재부팅이 필요한지 또는 옵션을 사용하여 다시 시작해야하는 서비스를 모두 확인하는 데 사용할 수 있습니다 -s.

needs-restarting -r0재부팅이 필요하지 않은 경우 반환 하고 필요 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옵션에는 루트 액세스 권한이 필요 하다는 것을 언급 할 가치가 있습니다.
Paul Gear

2
페도라를 들어, 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있습니까?
Zlemini

1
kernel-문자열의 출력과 비교하기 위해 제거해야합니다 uname -r그것을 포함되어 있지 않습니다.
alexm 2016 년

7

uname -a 출력을 설치된 커널 패키지 목록과 비교할 수 있습니다.


2
다른 커널이 리눅스 서버를 재부팅 해야하는 유일한 이유 입니까?
Chris_K

1
일반적으로 '정상적인'패키지 업그레이드 프로세스 (up2date, yum 등) 내에 머무를 때 커널 업그레이드 외에 시스템을 재부팅해야 할 다른 많은 이유가 없어야합니다.
Dominik

커널이 변경되지 않은 특정 패키지의 재부 팅이 필요할 것으로 의심됩니다 (centos6.0에 kexec-tools-2.0.0-258을 설치할 때 덤프 용으로 예약 된 메모리가 없었습니다)
nhed

BeyondTrust의 pbis-open 패키지는 stdout을 통해 설치 후 사용자에게 재부팅을 요청합니다.
bshacklett

6

uname -arpm -q kernelneeds-restarting에서yum-utils


5

"재부팅 필요"라는 관점에서 볼 때 도움이 될 수있는 한 가지는 업데이트로 제거 / 교체되었지만 활성 프로세스에서 이전 파일을 계속로드 / 사용하는 파일이 있는지 여부입니다.

기본적으로 YUM이 프로세스에서 사용중인 파일을 업데이트하면 파일 자체가 삭제 된 것으로 표시되었을 수 있지만 프로세스는 이전 파일의 inode에 대해 열린 파일 디스크립터가 있으므로 이전 파일을 계속 사용합니다.

여전히 사용중인 오래된 파일 수를 계산하는 명령 :

#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 지원 커널 버전이있는 경우 작동하지 않습니다. uname -r comamnd는 .elX 부분 다음에 PAE 접미사를 반환하지만 rpm 이름은 반환하지 않습니다.
Yanick Girouard

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 당신은 모든 새로운 rpm을 설치 한 곳을 확인합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.