如何从命令行检查RHEL或CentOS是否需要重启?


40

我在几台没有GUI的机器上使用CentOS和Red Hat Enterprise Linux。如何检查最近安装的更新是否需要重新启动?在Ubuntu中,我习惯于检查是否/var/run/reboot-required存在。

Answers:


34

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选项需要root访问。
Paul Gear

2
对于Fedora,needs-restartingDNF插件。它不支持-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 '17

7

您可以将uname -a的输出与已安装的内核软件包的列表进行比较


2
是不同的内核是Linux服务器需要重启的唯一原因吗?
Chris_K 2010年

1
通常,当停留在“常规”软件包升级过程中(up2date,yum等)时,除了内核升级外,应该没有很多其他原因来重新引导系统
Dominik 2010年

我怀疑某些其他软件包可能需要重新启动,内核不会更改(当我在centos6.0上安装kexec-tools-2.0.0-258时,没有为转储保留任何内存)
nhed

BeyondTrust的pbis-open软件包要求用户通过stdout安装后重新启动。
bshacklett 2015年

6

uname -a与。rpm -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 2013年

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.