RHELまたはCentOSで再起動が必要かどうかをコマンドラインから確認するにはどうすればよいですか?


40

GUIのない​​いくつかのマシンでCentOSとRed Hat Enterprise Linuxを使用しています。最近インストールされた更新プログラムの再起動が必要かどうかを確認するにはどうすればよいですか?Ubuntuでは、/var/run/reboot-required存在するかどうかを確認するのに慣れています。

回答:


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オプションにはルートアクセスが必要であることに注意してください。
ポール・ギア

2
Fedoraのために、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ますか?
ズレミニ16

1
kernel-文字列が出力と比較するために除去しなければならないuname -rことが含まれていません。
-alexm

7

uname -aの出力を、インストールされているカーネルパッケージのリストと比較できます。


2
Linuxサーバーがリブートを必要とする唯一の理由は、異なるカーネルですか?
Chris_K

1
通常は、「正常な」パッケージのアップグレードプロセス(up2dateを、YUMなど)内に滞在する場合、アップグレードカーネル以外に、システムを再起動するには、本当に多くの他の理由があってはならない
ドミニク・

他の特定のパッケージはカーネルの変更を伴わずに再起動が必要になると思われます(centos6.0にkexec-tools-2.0.0-258をインストールしたとき、ダンプ用にメモリが予約されていませんでした)
nhed

BeyondTrustのpbis-openパッケージは、インストール後にstdoutを介してユーザーに再起動を要求します。
bshacklett

6

uname -arpm -q kernelneeds-restartingからyum-utils


5

「再起動が必要」という観点から見ると役立つのは、更新によって削除/置換されたファイルが存在するかどうかですが、古いファイルはまだアクティブなプロセスによってロード/使用されています。

基本的に、YUMがプロセスで使用中のファイルを更新すると、ファイル自体に削除のマークが付けられている場合がありますが、古いファイルのiノードへのオープンファイル記述子があるため、プロセスは古いファイルを使用し続けます。

まだ使用中の古いファイルの数を取得するコマンド:

#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名は返しません。
ヤニックギルアール

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.