Làm cách nào tôi có thể kiểm tra từ dòng lệnh nếu cần khởi động lại trên RHEL hoặc CentOS?


40

Tôi đang sử dụng CentOS và Red Hat Enterprise Linux trên một số máy không có GUI. Làm cách nào để kiểm tra xem các bản cập nhật được cài đặt gần đây có yêu cầu khởi động lại không? Trong Ubuntu, tôi được sử dụng để kiểm tra nếu /var/run/reboot-requiredcó.

Câu trả lời:


34

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

Đừng quên rằng bạn có thể cần phải khởi động lại vì các cập nhật thư viện cốt lõi, ít nhất là nếu đó là glibc. (Và ngoài ra, các dịch vụ có thể cần phải được khởi động lại sau khi cập nhật).

Nếu bạn cài đặt yum-utilsgói, bạn có thể sử dụng một lệnh được gọi needs-restarting.

Bạn có thể sử dụng cả hai để kiểm tra xem có cần khởi động lại đầy đủ hay không vì cập nhật thư viện lõi hoặc lõi (sử dụng -rtùy chọn) hoặc dịch vụ nào cần được khởi động lại (sử dụng -stùy chọn).

needs-restarting -rtrả về 0nếu không cần khởi động lại, và 1nếu có, vì vậy nó là hoàn hảo để sử dụng trong một kịch bản.

Một ví dụ:

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
Điều đáng nói là ít nhất -stùy chọn này yêu cầu quyền truy cập root.
Paul Gear

2
Đối với Fedora, needs-restartingmột plugin DNF . Nó không hỗ trợ -rhoặc -s(chưa).
Franklin Yu

30

Về việc so sánh các hạt nhân đã cài đặt với việc chạy một:

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

Mong rằng sẽ giúp!


2
Lúc đầu, tôi nghĩ rằng nó không hoạt động vì nó tiếp tục bảo tôi khởi động lại sau khi tôi có, nhưng sau đó phát hiện ra rằng nếu bạn đang sử dụng một cá thể DigitalOcean, trước tiên bạn cần thay đổi kernel từ bảng điều khiển của chúng trước khi khởi động lại.
trình viên

Có một lý do tại sao kernel-chuỗi đang bị xóa khỏi đầu ra của rpm -q?
Zlemini

1
Các kernel-chuỗi phải được loại bỏ để so sánh nó với sản lượng từ uname -r, mà không chứa nó.
alexm

7

Bạn có thể so sánh thông số của uname -a với danh sách các gói kernel đã cài đặt


2
Là một hạt nhân khác là lý do duy nhất một máy chủ linux sẽ cần khởi động lại?
Chris_K

1
Thông thường, khi nằm trong các quy trình nâng cấp gói 'bình thường' (up2date, yum, v.v.), thực sự không nên có nhiều lý do khác để khởi động lại hệ thống bên cạnh việc nâng cấp kernel
Dominik

Tôi nghi ngờ rằng một số gói khác có thể yêu cầu một Eben reboot iof hạt nhân không thay đổi (khi tôi cài đặt kexec-cụ-2.0.0-258 trên centos6.0 không có bộ nhớ dành riêng cho các dump)
nhed

Gói mở pbis của BeyondTrust yêu cầu người dùng khởi động lại sau khi cài đặt qua thiết bị xuất chuẩn.
bshacklett

6

uname -aso với rpm -q kernelneeds-restartingtừyum-utils


5

Một điều có thể hữu ích để xem xét về "yêu cầu khởi động lại" là có hay không có bất kỳ tệp nào đã bị xóa / thay thế bởi bản cập nhật nhưng các tệp cũ vẫn được tải / sử dụng bởi các quy trình hoạt động.

Về cơ bản, khi YUM cập nhật một tệp đang được sử dụng bởi một quy trình, chính tệp đó có thể đã được đánh dấu để xóa, nhưng quá trình này vẫn tiếp tục sử dụng tệp cũ vì nó có một mô tả tệp mở cho inode của tệp cũ.

Lệnh lấy số lượng tệp cũ vẫn đang sử dụng:

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

Lệnh đó sẽ cung cấp cho bạn một số lượng các tập tin.

Sử dụng thay thế để xem tập tin nào đang thực sự được sử dụng:

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

Lệnh đó sẽ tạo đầu ra tương tự như sau trên hộp được cập nhật 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

Kiểm tra xem chạy kernel là cái mới nhất.

Nếu không, hãy kiểm tra xem hệ thống đã được khởi động lại từ khi cài đặt kernel chưa.

Nếu không, khởi động lại.

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

Điều này không hoạt động nếu bạn có phiên bản kernel kích hoạt PAE. Comamnd uname -r trả về hậu tố PAE sau phần .elX nhưng không phải là tên vòng / phút.
Yanick Girouard

1

Tôi biết câu hỏi này đã được trả lời và mọi người đã đăng thông tin về việc kiểm tra các hạt nhân mới hơn cũng như các tệp đã bị xóa, nhưng gần đây tôi đã viết một tập lệnh kiểm tra cả hai. Nếu một trong hai điều kiện được phát hiện, quá trình khởi động lại được lên lịch trong +30 phút.

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

Đây là phiên bản mã alexm của tôi. Bạn có thể làm được việc này:

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 bạn kiểm tra nơi này tất cả những gì có vòng quay mới đã cài đặt

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.