Bagaimana saya bisa memeriksa dari baris perintah jika reboot diperlukan pada RHEL atau CentOS?

40

Saya menggunakan CentOS dan Red Hat Enterprise Linux pada beberapa mesin tanpa GUI. Bagaimana saya dapat memeriksa apakah pembaruan yang baru diinstal memerlukan reboot? Di Ubuntu, saya sudah terbiasa memeriksa apakah /var/run/reboot-requiredada.

Jim Hunziker
sumber

Jawaban:

34

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

Jangan lupa bahwa Anda mungkin harus mem-boot ulang karena pembaruan perpustakaan inti, setidaknya jika itu glibc. (Dan juga, layanan mungkin perlu direstart setelah pembaruan).

Jika Anda menginstal yum-utilspaket, Anda dapat menggunakan perintah yang disebut needs-restarting.

Anda dapat menggunakannya untuk memeriksa apakah reboot penuh diperlukan karena pembaruan kernel atau core libraries (menggunakan -ropsi), atau layanan apa yang perlu direstart (menggunakan -sopsi).

needs-restarting -rkembali 0jika reboot tidak diperlukan, dan 1jika perlu, jadi sangat cocok untuk digunakan dalam skrip.

Sebuah contoh:

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
xddsg
sumber
1
Perlu disebutkan bahwa setidaknya -sopsi membutuhkan akses root.
Paul Gear
2
Untuk Fedora, needs-restartingadalah plugin DNF . Itu tidak mendukung -ratau -s(belum).
Franklin Yu
30

Tentang membandingkan kernel yang diinstal dengan menjalankan kernel:

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

Semoga itu bisa membantu!

alexm
sumber
2
Pada awalnya saya pikir ini tidak berfungsi karena terus memberitahu saya untuk reboot setelah saya lakukan, tetapi kemudian menemukan bahwa jika Anda menggunakan instance DigitalOcean, Anda perlu mengubah kernel secara manual dari panel kontrol mereka terlebih dahulu sebelum reboot.
Programster
Apakah ada alasan mengapa kernel-string dihapus dari output rpm -q?
Zlemini
1
The kernel-String harus dikeluarkan untuk membandingkannya dengan output dari uname -r, yang tidak mengandung itu.
alexm
7

Anda dapat membandingkan ouput uname -a dengan daftar paket kernel yang diinstal

Dominik
sumber
2
Apakah kernel yang berbeda satu-satunya alasan server linux perlu reboot?
Chris_K
1
Biasanya, ketika tetap berada dalam proses peningkatan paket 'normal' (up2date, yum dll.), Seharusnya tidak ada banyak alasan lain untuk me-reboot sistem selain dari upgrade kernel
Dominik
Saya menduga bahwa paket-paket lain mungkin memerlukan reboot eben iof kernel tidak berubah (ketika saya menginstal kexec-tools-2.0.0-258 pada centos6.0 tidak ada memori yang disediakan untuk dump)
nhed
Paket pbis-open BeyondTrust meminta pengguna untuk reboot setelah instalasi melalui stdout.
bshacklett
6

uname -avs. rpm -q kerneldan needs-restartingdariyum-utils

PTman
sumber
5

Satu hal yang dapat membantu untuk dilihat dalam hal "adalah reboot diperlukan" adalah apakah ada file yang telah dihapus / diganti oleh pembaruan tetapi file lama masih dimuat / digunakan oleh proses aktif.

Pada dasarnya, ketika YUM memperbarui file yang digunakan oleh suatu proses, file itu sendiri mungkin telah ditandai untuk dihapus, tetapi proses terus menggunakan file lama karena memiliki file-deskriptor terbuka untuk inode file lama.

Perintah untuk menghitung jumlah file lama yang masih digunakan:

#lsof | grep "(path inode=.*)" | wc -l

Perintah itu akan memberi Anda hitungan file.

Gunakan ini sebagai gantinya untuk melihat file mana yang sebenarnya digunakan:

#lsof | grep "(path inode=.*)"

Perintah itu akan menghasilkan keluaran yang serupa dengan yang berikut pada kotak yang diperbarui 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
GrangerX
sumber
2

Periksa apakah kernel yang berjalan adalah yang terbaru.

Jika tidak, periksa apakah sistem telah dimulai ulang sejak instalasi kernel.

Jika tidak, reboot.

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
Nicolas Melay
sumber
Ini tidak berfungsi jika Anda memiliki versi kernel yang diaktifkan PAE. Perintah unr -r mengembalikan sufiks PAE setelah bagian .elX tetapi bukan nama rpm.
Yanick Girouard
1

Saya tahu pertanyaan ini sudah dijawab dan orang-orang telah memposting informasi tentang memeriksa kernel yang lebih baru serta file yang dihapus, tetapi saya baru-baru ini menulis sebuah skrip yang memeriksa keduanya. Jika salah satu kondisi terdeteksi, reboot dijadwalkan +30 menit.

#!/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}"
Liczyrzepa
sumber
1

Ini adalah versi saya dari kode alexm. Kamu bisa melakukan ini:

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
sandman
sumber
-5

install.log install.log.syslog yum.log Anda memeriksa tempat ini apa yang mendapat semua rpm baru instal

Rajat
sumber