RHEL veya CentOS'ta yeniden başlatma gerektiğinde komut satırından nasıl kontrol edebilirim?


39

GUI'siz birkaç makinede CentOS ve Red Hat Enterprise Linux kullanıyorum. Yeni yüklenen güncellemelerin yeniden başlatılmasını gerektirip gerektirmediğini nasıl kontrol edebilirim? Ubuntu'da var olup olmadığını kontrol etmeye alışkınım /var/run/reboot-required.

Yanıtlar:


33

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

En azından glibc ise, çekirdek kütüphane güncellemeleri nedeniyle yeniden başlatmanız gerekebileceğini unutmayın. (Ayrıca, servislerin güncellemelerin ardından yeniden başlatılması gerekebilir).

Eğer yüklerseniz yum-utilspaketi, adlı bir komutu kullanabilirsiniz needs-restarting.

Çekirdek veya çekirdek kitaplık güncellemeleri nedeniyle ( -rseçeneğin kullanılmasıyla) tam bir yeniden başlatmanın gerekip gerekmediğini veya hangi servislerin yeniden başlatılması gerektiğini ( -sseçeneği kullanarak ) kontrol etmek için her ikisini de kullanabilirsiniz .

needs-restarting -r0Eğer yeniden başlatma gerekli 1değilse ve eğer öyleyse, betiğin içinde kullanmak için mükemmel olan döner .

Bir örnek:

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
En azından -sseçeneğin root erişimi gerektirdiğinden bahsetmeye değer .
Paul Gear,

2
Fedora needs-restartingiçin bir DNF eklentisidir . Desteklemiyor -rveya -s(henüz).
Franklin Yu,

30

Kurulu çekirdeklerin birini çalıştırmakla karşılaştırması hakkında:

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

Umarım yardımcı olur!


2
İlk başta bunun benim açtıktan sonra yeniden başlatmamı söylemeye devam ettiği için işe yaramadığını düşündüm, ancak daha sonra bir DigitalOcean örneği kullanıyorsanız, yeniden başlatmadan önce çekirdeği kendi kontrol panellerinden elle değiştirmeniz gerektiğini öğrendim.
Programcı

kernel-Dize çıkışından kaldırılmasının bir nedeni var mı rpm -q?
Zlemini

1
kernel-Dize gelen çıkışıyla karşılaştırmak için kaldırılmalıdır uname -rbunu içermez.
alexm

7

-A uname çıkışını kurulu çekirdek paketlerinin listesiyle karşılaştırabilirsiniz.


2
Farklı bir çekirdek, linux sunucunun yeniden başlatmaya ihtiyaç duymasının tek nedeni mi?
Chris_K

1
Normal olarak, 'normal' paket yükseltme işlemlerinde (up2date, yum vb.) Kalırken, sistemi çekirdek yükseltme işleminin yanı sıra yeniden başlatmak için başka pek çok neden olmamalıdır
Dominik

(Ben kexec-araçları-2.0.0-258 centos6.0 üzerinde dökümü için ayrılan hafıza yoktu yüklendiğinde) arasında söz konusu diğer paketler değişmez kernel iof yeniden başlatma Eben gerektirebilir şüpheli
nhed

BeyondTrust'un pbis-open paketi, kullanıcının kurulumdan sonra stdout üzerinden yeniden başlatılmasını ister.
bshacklett

6

uname -avs rpm -q kernelve needs-restartinggelenyum-utils


5

"Gerekli bir yeniden başlatma" açısından bakılması yararlı olabilecek bir şey, güncelleme tarafından kaldırılmış / değiştirilmiş, ancak eski dosyaların hala aktif işlemler tarafından yüklenmiş / kullanılmış olup olmadığıdır.

Temel olarak, YUM bir işlem tarafından kullanılan bir dosyayı güncellediğinde, dosyanın kendisi silinmek üzere işaretlenmiş olabilir, ancak işlem eski dosyayı kullanmaya devam eder, çünkü eski dosyanın inode'unda açık bir dosya tanıtıcısı vardır.

Halen kullanılmakta olan eski dosyaların sayısını almak için bir komut:

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

Bu komut size çok sayıda dosya verecektir.

Hangi dosyaların gerçekten kullanımda olduğunu görmek için bunu kullanın:

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

Bu komut, YUM tarafından güncellenen bir kutuda aşağıdakine benzer bir çıktı üretecektir:

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

Çalışan çekirdeğin en yenisi olup olmadığını kontrol edin.

Değilse, çekirdek yüklendikten sonra sistemin yeniden başlatılıp başlatılmadığını kontrol edin.

Olmadıysa, yeniden başlatın.

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 özellikli bir çekirdek sürümünüz varsa bu çalışmaz. -R comamnd ismi, .elX bölümünden sonra PAE sonekini döndürür, rpm adlarını döndürmez.
Yanick Girouard 13:13

1

Bu sorunun çoktan cevaplandığını ve milletlerin silinen dosyaların yanı sıra daha yeni çekirdeklerin kontrolü hakkında bilgi gönderdiğini biliyorum, ancak geçenlerde her ikisini de kontrol eden bir senaryo yazdım. Her iki koşul da tespit edilirse, yeniden başlatma işlemi +30 dakika için planlanır.

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

İşte alexm kodunun sürümü. Bunu yapabilirsiniz:

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 burada tüm yeni rpm'lerin kurulumunu yaptıklarını kontrol ettiniz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.