यदि मैं RHEL या CentOS पर रीबूट आवश्यक है, तो मैं कमांड लाइन से कैसे जांच कर सकता हूं?


40

मैं GUI के बिना कुछ मशीनों पर CentOS और Red Hat Enterprise Linux का उपयोग कर रहा हूँ। हाल ही में स्थापित अपडेट को रिबूट की आवश्यकता होने पर मैं कैसे जांच सकता हूं? उबंटू में, मैं /var/run/reboot-requiredमौजूद है अगर जाँच करने के लिए उपयोग किया जाता है।

जवाबों:


34

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

मत भूलो कि आपको मुख्य पुस्तकालय अपडेट के कारण रिबूट करने की आवश्यकता हो सकती है, कम से कम अगर यह शानदार है। (और, अपडेट के बाद सेवाओं को फिर से शुरू करने की आवश्यकता हो सकती है)।

यदि आप 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
फेडोरा के लिए, 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?
ज़लेमिनि

1
kernel-स्ट्रिंग से उत्पादन के साथ तुलना करना हटा दिया जाना चाहिए uname -r, जो यह शामिल नहीं है।
एलेक्सम

7

आप स्थापित कर्नेल पैकेजों की सूची के साथ uname -a के ouput की तुलना कर सकते हैं


2
क्या एक अलग कर्नेल एकमात्र कारण है जिससे लिनक्स सर्वर को रिबूट की आवश्यकता होगी ?
क्रिस_के

1
आम तौर पर, 'सामान्य' पैकेज अपग्रेड प्रक्रियाओं (up2date, yum आदि) के भीतर रहने पर, कर्नेल अपग्रेड के अलावा सिस्टम को रिबूट करने के लिए वास्तव में कई अन्य कारण नहीं होने चाहिए
डोमिनिक

मुझे संदेह है कि कुछ अन्य पैकेजों में रिबूट eben की आवश्यकता हो सकती है Iof कर्नेल नहीं बदलता है (जब मैंने kexec-tools-2.0.0-258 को centos6.0 पर स्थापित किया था तो डंप के लिए कोई मेमोरी आरक्षित नहीं थी)
nhed

BeyondTrust के pbis- ओपन पैकेज उपयोगकर्ता को stdout के माध्यम से इंस्टॉलेशन के बाद रिबूट करने का अनुरोध करता है।
bshacklett


5

"रिबूट आवश्यक है" के संदर्भ में एक चीज जो देखने में मददगार हो सकती है वह यह है कि क्या कोई ऐसी फाइल है जिसे अद्यतन द्वारा हटा दिया गया है / बदल दिया गया है लेकिन जिसके लिए पुरानी फाइलें अभी भी सक्रिय प्रक्रियाओं द्वारा लोड / उपयोग की जा रही हैं।

असल में, जब YUM एक ऐसी फ़ाइल को अपडेट करता है, जो किसी प्रक्रिया द्वारा उपयोग की जाती है, तो फ़ाइल को स्वयं हटाने के लिए चिह्नित किया जा सकता है, लेकिन प्रक्रिया पुरानी फ़ाइल का उपयोग करती रहती है क्योंकि इसमें पुरानी फ़ाइल के इनकोड में एक ओपन फ़ाइल-डिस्क्रिप्टर होता है।

पुरानी फ़ाइलों की संख्या की गणना करने के लिए एक कमांड का उपयोग अभी भी किया जाता है:

#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

-5

install.log install.log.syslog yum.log आप इस जगह की जांच करें कि सभी को क्या नया आरपीएम मिला है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.