ฉันจะตรวจสอบจากบรรทัดคำสั่งได้อย่างไรหากต้องการรีบูตใน RHEL หรือ CentOS


39

ฉันใช้ CentOS และ Red Hat Enterprise Linux บนเครื่องบางเครื่องที่ไม่มี GUI ฉันจะตรวจสอบได้อย่างไรว่าการอัพเดทที่เพิ่งติดตั้งต้องการการรีบูตหรือไม่ ใน Ubuntu ฉันใช้เพื่อตรวจสอบว่า/var/run/reboot-requiredมีอยู่หรือไม่

คำตอบ:


33

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

อย่าลืมว่าคุณอาจต้องรีบูตเครื่องเนื่องจากการอัปเดตห้องสมุดหลักอย่างน้อยถ้าเป็น glibc (และอาจต้องเริ่มบริการใหม่อีกครั้งหลังจากการอัพเดต)

หากคุณติดตั้งแพคเกจที่คุณสามารถใช้คำสั่งที่เรียกว่าyum-utilsneeds-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

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 คุณต้องเปลี่ยนเคอร์เนลจากแผงควบคุมก่อนทำการรีบูตด้วยตนเอง
โปรแกรม

มีเหตุผลทำไมkernel-สตริงถูกลบออกจากผลลัพธ์ของrpm -q?
Zlemini

1
kernel-สตริงจะต้องออกไปเปรียบเทียบกับการส่งออกจากuname -rที่ไม่ได้มีมัน
alexm

7

คุณสามารถเปรียบเทียบ ouput ของ uname -a กับรายการแพคเกจเคอร์เนลที่ติดตั้ง


2
เคอร์เนลที่แตกต่างกันเป็นเหตุผลเดียวที่เซิร์ฟเวอร์ linux ต้องการการรีบูตหรือไม่
Chris_K

1
โดยปกติเมื่ออยู่ในกระบวนการอัปเกรดแพคเกจ 'ปกติ' (up2date, yum ฯลฯ ) ไม่ควรมีเหตุผลอื่น ๆ อีกมากมายในการรีบูตระบบนอกเหนือจากการอัพเกรดเคอร์เนล
Dominik

ฉันสงสัยว่าแพคเกจอื่น ๆ บางอย่างอาจต้องรีบูต Eben IOF เคอร์เนลไม่เปลี่ยนแปลง (ตอนที่ผมติดตั้ง kexec-เครื่องมือ 2.0.0-258 บน centos6.0 มีหน่วยความจำที่สงวนไว้สำหรับการถ่ายโอนข้อมูล)
nhed

แพคเกจ pbis เปิดของ BeyondTrust ขอให้ผู้ใช้รีบูตหลังจากการติดตั้งผ่าน stdout
bshacklett


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 ส่งคืน PAE suffix หลังส่วน. elX แต่ไม่ใช่ชื่อ rpm
Yanick Girouard

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 คุณตรวจสอบที่นี่ว่าทุกอย่างมีการติดตั้งใหม่หรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.