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

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

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

不要忘记,由于核心库更新,您可能需要重新启动,至less如果它是glibc的话。 (而且,更新后可能需要重新启动服务)。

如果您安装yum-utils软件包,则可以使用名为needs-restarting的命令。

您可以使用它来检查是否由于内核或核心库更新(使用-r选项)而需要完全重新启动,或需要重新启动哪些服务(使用-s选项)。

needs-restarting -r如果不需要重新引导,则返回0如果是,则返回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 

关于比较安装的内核和运行的内核:

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

希望有所帮助!

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

uname -arpm -q kernelneeds-restartingyum-utils needs-restarting

有一件事可以用“需要重新启动”的方式来看待,那就是是否有任何文件已经被更新删除/replace,但是旧文件仍然被活动进程加载/使用。

基本上,当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 

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

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

如果不是,重新启动。

 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 

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

这是我的版本的alexm代码。 你可以这样做:

 LAST_KERNEL=$(rpm -q --last kernel | perl -pe 's/^kernel-(\S+).*/$1/' | head -1) CURRENT_KERNEL=$(uname -r) if [ -f "$LAST_KERNEL = $CURRENT_KERNEL" ] then echo "It is time to Reboot!" else echo "There is nothing to do!" fi 

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