AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 122178
Accepted
Jim Hunziker
Jim Hunziker
Asked: 2010-03-14 04:52:48 +0800 CST2010-03-14 04:52:48 +0800 CST 2010-03-14 04:52:48 +0800 CST

如果需要在 RHEL 或 CentOS 上重新启动,我如何从命令行检查?

  • 772

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

centos yum redhat rhel5 update
  • 9 9 个回答
  • 99661 Views

9 个回答

  • Voted
  1. Best Answer
    xddsg
    2017-09-16T05:27:58+08:002017-09-16T05:27:58+08:00

    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
    
    • 71
  2. alexm
    2011-09-16T04:15:21+08:002011-09-16T04:15:21+08:00

    关于将已安装的内核与正在运行的内核进行比较:

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

    希望有帮助!

    • 37
  3. Dominik
    2010-03-14T05:14:15+08:002010-03-14T05:14:15+08:00

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

    • 8
  4. GrangerX
    2015-06-20T08:18:23+08:002015-06-20T08:18:23+08:00

    在“是否需要重新启动”方面有助于查看的一件事是,是否有任何文件已被更新删除/替换,但旧文件仍被活动进程加载/使用。

    基本上,当 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
    
    • 8
  5. ptman
    2016-11-16T10:30:01+08:002016-11-16T10:30:01+08:00

    uname -a对比rpm -q kernel和needs-restarting从yum-utils

    • 7
  6. Nicolas Melay
    2012-03-10T20:54:22+08:002012-03-10T20:54:22+08:00

    检查正在运行的内核是否是最新的。

    如果不是,请检查系统是否在内核安装后重新启动。

    如果不是,请重新启动。

    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
    
    • 3
  7. Liczyrzepa
    2016-11-16T10:22:37+08:002016-11-16T10:22:37+08:00

    我知道这个问题已经得到解答,人们已经发布了有关检查更新内核和已删除文件的信息,但我最近编写了一个脚本来检查这两者。如果检测到任何一种情况,则重新启动计划为 +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}"
    

    2020-07-15 更新

    自从最初编写此答案以来,我已经改进和更新了脚本。它在 github 上可用:https ://github.com/qth/jutil/blob/master/rbc

    • 2
  8. sandman
    2017-08-22T17:11:45+08:002017-08-22T17:11:45+08:00

    这是我的 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
    
    • 1
  9. Rajat
    2010-07-17T03:36:57+08:002010-07-17T03:36:57+08:00

    install.log install.log.syslog yum.log 你检查这个地方 什么都得到了新的 rpm 得到了安装

    • -7

相关问题

  • 如何及时了解有关 UNIX 软件补丁和升级的最新信息?

  • 您要等多久才能安装更新?

  • Microsoft Office 更新无法安装

  • 为什么 redhat 在企业界似乎如此受欢迎?[关闭]

  • Windows Server Update Services (WSUS) 4.0 最想要的功能 [关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve