আরএইচইএল বা সেন্টস-এ পুনরায় বুট করার দরকার হলে আমি কীভাবে কমান্ড লাইনটি থেকে পরীক্ষা করতে পারি?


40

আমি জিইউআই ছাড়াই কয়েকটি মেশিনে সেন্টোস এবং রেড হ্যাট এন্টারপ্রাইজ লিনাক্স ব্যবহার করছি। ইনস্টল করা আপডেটগুলিতে পুনরায় বুট করার দরকার আছে কিনা তা আমি কীভাবে পরীক্ষা করতে পারি? উবুন্টুতে, আমি /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জন্য একটি ডিএনএফ প্লাগইন । এটি সমর্থন করে না -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
প্রথমে আমি ভেবেছিলাম এটি কাজ করছে না কারণ এটি আমার থাকার পরে পুনরায় বুট করতে বলেছিল, তবে তারপরে জানতে পেরেছি যে আপনি যদি ডিজিটালইশন উদাহরণ ব্যবহার করছেন তবে আপনাকে পুনরায় বুট করার আগে প্রথমে তাদের নিয়ন্ত্রণ প্যানেল থেকে কার্নেলটি ম্যানুয়ালি পরিবর্তন করতে হবে।
প্রোগ্রামার

kernel-স্ট্রিংটির আউটপুট থেকে সরানোর কোনও কারণ আছে rpm -q?
জ্লেমিনি

1
এর kernel-থেকে আউটপুটটির সাথে তুলনা করতে স্ট্রিংটি অবশ্যই মুছে ফেলতে হবে uname -r, এতে এটি নেই।
অ্যালেক্স

7

ইনস্টল করা কার্নেল প্যাকেজগুলির তালিকার সাথে আপনি আনম-আউটপুটটির তুলনা করতে পারেন


2
একটি লিনাক্স সার্ভারের পুনরায় বুট করার প্রয়োজনের কারণেই কি আলাদা কার্নেল ?
ক্রিস_কে

1
সাধারণত, 'সাধারণ' প্যাকেজ আপগ্রেড প্রক্রিয়াগুলির মধ্যে থাকা অবস্থায় (up2date, yum ইত্যাদি), কার্নেল আপগ্রেড ছাড়াও সিস্টেমটি পুনরায় বুট করার সত্যিই আরও অনেক কারণ থাকতে হবে না
ডোমিনিক

আমি সন্দেহ যে অন্য কিছু প্যাকেজ কার্নেল ফোরামের নিয়ে জন্য পুনরায় চালু করা Eben প্রয়োজন হতে পারে পরিবর্তন করে না (যখন আমি 'র পরিবর্তে kexec-সরঞ্জাম-2.0.0-258 centos6.0 উপর কোন মেমরি ডাম্প জন্য সংরক্ষিত ছিল ইনস্টল করা আছে)
nhed

বাইন্ডা ট্রাস্টের পিবিস-ওপেন প্যাকেজটি স্ট্যান্ডআউটের মাধ্যমে ব্যবহারকারীকে পুনরায় বুট করার অনুরোধ করে।
bshacklett

6

uname -aবনাম rpm -q kernelএবং needs-restartingথেকেyum-utils


5

একটি জিনিস যা "রিবুট আবশ্যক" এর শর্তে দেখতে সহায়তা করতে পারে তা হ'ল আপডেটের দ্বারা সরানো / প্রতিস্থাপন করা এমন কোনও ফাইল রয়েছে কি না তবে পুরানো ফাইলগুলি এখনও সক্রিয় প্রক্রিয়াগুলি দ্বারা লোড করা / ব্যবহৃত হয়েছে।

মূলত, যখন ইউএমএম কোনও প্রক্রিয়া দ্বারা ব্যবহৃত একটি ফাইল আপডেট করে, ফাইলটি নিজেই মুছে ফেলার জন্য চিহ্নিত করা হয়েছিল, তবে এটি পুরানো ফাইলটির ইনোডে একটি খোলা ফাইল-বর্ণনাকারী রয়েছে বলে প্রক্রিয়াটি পুরানো ফাইলটি ব্যবহার করে চলেছে।

এখনও ব্যবহৃত পুরানো ফাইলগুলির সংখ্যা গণনা করার জন্য একটি আদেশ:

#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 সক্ষম কার্নেল সংস্করণ থাকে তবে এটি কাজ করে না। আনম-আর কোমেন্ড পিএইউ প্রত্যয়টি .elX অংশের পরে ফেরত দেয় তবে আরপিএমের নাম দেয় না।
ইয়ানিক গিরোয়ার্ড

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

এখানে আমার অ্যালেক্সাম কোডটির সংস্করণ। তুমি এটি করতে পারো:

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

ইনস্টল.লগ ইন্সটল.লগ.সাইজলগ.ইম.লগ আপনি এই জায়গাটি যাচাই করে নিন যে সমস্ত নতুন আরপিএম কীভাবে ইনস্টল হয়েছে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.