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


256

เมื่อคุณติดตั้งการอัปเดตบางอย่าง (เช่นเคอร์เนลใหม่) ใน Ubuntu Desktop คุณจะได้รับการระบุว่าจำเป็นต้องรีบูต (ใน Lucid ไอคอนล็อกเอาต์จะเปลี่ยนเป็นสีแดง)

ฉันจะตรวจสอบจากบรรทัดคำสั่งได้อย่างไรว่าเซิร์ฟเวอร์ Ubuntu ต้องการการรีบูตหรือไม่

ฉันสามารถ grep สำหรับ 'ต้องรีสตาร์ทระบบ' ใน/etc/motdแต่ฉันต้องการโซลูชันที่สวยงามกว่า นอกจากนี้ฉันต้องการโซลูชันที่ทำงานในรุ่นเก่าเช่น Hardy (8.04 LTS)


หากคุณบำรุงรักษาเซิร์ฟเวอร์คุณจะพัฒนาเร็ว ๆ นี้ไม่ว่าจะปรับปรุงหรือไม่จำเป็นต้องเริ่มต้นใหม่ การอัปเดตส่วนใหญ่ไม่จำเป็นต้องรีสตาร์ทหรือรีสตาร์ทบริการเท่านั้น (แม่มดควรทำโดยอัตโนมัติ)
eXlin

คำตอบ:


289

คุณสามารถตรวจสอบว่ามีไฟล์/var/run/reboot-requiredอยู่หรือไม่

ตัวอย่างเช่นสิ่งเหล่านี้จะบอกคุณว่า "ไม่มีไฟล์ดังกล่าว" หรือ "ไม่พบไฟล์" หากคุณไม่ต้องการรีบูตมิฉะนั้น (หากคุณต้องการรีบูต) ไฟล์จะมีอยู่และคำสั่งเหล่านี้จะแสดงข้อมูลเกี่ยวกับไฟล์:

file /var/run/reboot-required
stat /var/run/reboot-required
ls /var/run/reboot-required

ในสคริปต์ทุบตีคุณสามารถใช้:

#!/bin/bash
if [ -f /var/run/reboot-required ]; then
  echo 'reboot required'
fi

1
มันใช้งานได้และมันก็ใช้ได้กับ Hardy ด้วย (ใช้งานไม่ได้กับ Dapper - 6.06 - ซึ่งฉันยังมีอยู่ในเครื่องเดียวยากลำบาก) ไฟล์ที่ต้องการ / var / run / reboot จำเป็นต้องสร้างโดย / usr / share / update-notifier / alert-reboot จำเป็นต้องใช้ซึ่งเรียกใช้จากสคริปต์ผู้ดูแลแพคเกจต่างๆ
Marius Gedminas

2
มันจะทำงานบน Dapper ด้วยเช่นกันถ้าฉันติดตั้งแพ็คเกจตัวแจ้งเตือนอัปเดตยกเว้นว่ามันต้องการดึงสิ่ง GNOME ที่มีค่าจำนวน 120 megs ลงในเซิร์ฟเวอร์โบราณของฉัน
Marius Gedminas

10
ดีกว่าการติดตั้ง update-notifier-common มันไม่ได้ขึ้นอยู่กับ GUI ใด ๆ (แต่ไม่มีสำหรับ Dapper)
Marius Gedminas

1
FWIW, update-notifier-common ไม่ได้ถูกติดตั้งบนเซิร์ฟเวอร์ Lucid โดยค่าเริ่มต้น
Marius Gedminas

5
ขอบคุณ! และไฟล์/var/run/reboot-required.pkgsจะแสดงรายการแพ็กเกจที่ต้องรีบูต
nealmcb

44

ในแพ็คเกจ debian-goodies เป็นคำสั่งที่มีชื่อว่าcheckrestartค่อนข้างมีประโยชน์ เอาต์พุตสามารถช่วยคุณหลีกเลี่ยงการรีบูทเต็มรูปแบบ

มันบอกคุณว่าแอพพลิเคชั่นที่ใช้งานได้ทำการโหลดไลบรารี่ที่แชร์ซึ่งอัพเกรดแล้วในขณะที่แอพพลิเคชั่นนั้นทำงานอยู่ จากนั้นคุณรีสตาร์ทแอปพลิเคชันและบริการด้วยตนเองและหลีกเลี่ยงการรีบูตเต็ม ไม่ช่วยในการอัพเกรดเคอร์เนล


1
จะทำให้ฉันหลีกเลี่ยงการรีบูตเต็มได้อย่างไร
Oxwivi

11
มันบอกคุณว่าแอพพลิเคชั่นที่ใช้งานได้ทำการโหลดไลบรารี่ที่แชร์ซึ่งอัพเกรดแล้วในขณะที่แอพพลิเคชั่นนั้นทำงานอยู่ จากนั้นคุณรีสตาร์ทแอปพลิเคชันและบริการด้วยตนเองและหลีกเลี่ยงการรีบูตเต็ม ไม่ช่วยในการอัพเกรดเคอร์เนล
aquaherd

นี่ควรเป็นคำตอบที่ดีที่สุด มีประโยชน์มาก OpenSUSE มีเครื่องมือในตัว (และยังช่วยคุณในการเรียกใช้) ความอัปยศอูบุนตูก็แค่ "เริ่มใหม่รีสตาร์ท" ตัวอย่างเช่น colord ต้องการการรีสตาร์ทที่นี่ ดังนั้นไม่จำเป็นต้องรีสตาร์ท
ชิกิ

@aquaherd ความคิดเห็นที่เป็นประโยชน์มาก - อาจคุ้มค่าที่จะย้ายเข้าไปในคำตอบของคุณ?
Duncan Jones

33

โดยปกติถ้าไฟล์

/var/run/reboot-required 

มีอยู่คุณควรรีบูต คุณสามารถดูว่าไฟล์นี้มีโดยใช้คำสั่งง่าย ๆ ใน gnome-terminal

ls /var/run/reboot-required

ไฟล์นี้ดูเหมือนว่าจะไม่ถูกสร้างขึ้นอีกต่อไปจาก update-notifier-common ที่ใช้ในการสร้าง
สกอตต์

17

เช่นเดียวกับวิธีที่ตรงที่สุดที่เขียนโดยคนอื่นมีข้อบ่งชี้ที่สะดวกถ้าคุณใช้byobu - ชุดของสคริปต์เพื่อทำให้หน้าจอ GNU เป็นมิตรกับผู้ใช้มากขึ้น มันแสดงชุดของข้อมูลที่ด้านล่างของหน้าจอและที่สามารถรวมว่าจำเป็นต้องมีการรีบูต - พร้อมกับการอัปเดตที่มีอยู่, เวลา, สถานะการออนไลน์, หน่วยความจำที่ใช้ ...

ในภาพหน้าจอนี้คุณสามารถดูได้จาก199!บรรทัดล่างสุดด้วยพื้นหลังสีแดงที่มีการปรับปรุง 199 รายการ หมายความว่าบางคนมีการปรับปรุงความปลอดภัย!! เมนูในเบื้องหน้าคือการเลือกการแจ้งเตือนสถานะที่จะแสดง

หากจำเป็นต้องบูตเครื่องใหม่จะมีสัญลักษณ์(R)แสดงขึ้นในแถบด้านล่างพร้อมข้อความสีขาวบนพื้นหลังสีน้ำเงิน รายละเอียดเพิ่มเติมและตัวชี้วัดอื่น ๆ สามารถอ่านเกี่ยวกับในหน้าคน byobu

ภาพหน้าจอ


9

/etc/motdไฟล์ได้รับข้อมูลเกี่ยวกับว่าจำเป็นต้องรีบูตจาก/var/run/reboot-requiredไฟล์

คุณสามารถตรวจสอบเนื้อหาของไฟล์นี้ในเทอร์มินัลโดยใช้cat /etc/motdคำสั่ง


update-notifier-common ใช้ในการสร้างสิ่งนี้ แต่ไม่ได้อีกต่อไป
สกอตต์

8

หากคุณติดตั้งแพ็กเกจ reboot-notifier หรือ update-notifier-common คุณจะได้รับไฟล์ / var / run / reboot-required และ /var/run/reboot-required.pkgs

reboot-notifierนั้นใหม่กว่าใน Ubuntu Wily และ Xenial ยืดเดเบียน แต่ในเจสซี backport

update-notifier-common นั้นเก่ากว่าในทุกเวอร์ชั่นของ Ubuntu รวมถึง Xenial และ Debian Wheezy ไม่ได้อยู่ใน Debian Stretch หรือ Jessie

(มีบางพื้นหลังของแพ็คเกจ reboot-notifier ที่https://feeding.cloud.geek.nz/posts/introducing-reboot-notifier/ )

หากคุณไม่ได้ติดตั้งแพ็คเกจเหล่านี้คุณสามารถเปรียบเทียบรุ่นของแพ็คเกจ linux ที่ติดตั้งไว้กับรุ่นที่ใช้งานอยู่:

tim@tramp:~$ dpkg -l linux-image-*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                              Version               Architecture          Description
+++-=================================-=====================-=====================-=======================================================================
ii  linux-image-3.16.0-4-amd64        3.16.7-ckt20-1+deb8u4 amd64                 Linux 3.16 for 64-bit PCs
ii  linux-image-amd64                 3.16+63               amd64                 Linux for 64-bit PCs (meta-package)
tim@tramp:~$ more /proc/version
Linux version 3.16.0-4-amd64 (debian-kernel@lists.debian.org) (gcc version 4.8.4 (Debian 4.8.4-1) ) #1 SMP Debian <b>3.16.7-ckt20-1+deb8u3</b> (2016-01-17)

คุณสามารถดูได้ที่นี่ว่าเคอร์เนลที่ติดตั้งล่าสุดคือ 3.16.7-ckt20-1 + deb8u4 แต่เคอร์เนลที่รันคือ 3.16.7-ckt20-1 + deb8u3 ดังนั้นระบบนี้ต้องการการรีบูต u4 กับ u3 ถูกต้องในตอนท้าย

คุณอาจต้องเลื่อนกล่องด้านบน ใน / proc / version เป็นเวอร์ชันใกล้กับจุดสิ้นสุดของบรรทัดที่สำคัญ

การเปลี่ยนแปลงรหัสรุ่นรองมากเป็นเรื่องปกติของการปรับปรุงเคอร์เนลความปลอดภัย Debian

needrestart

ตัวเลือกอื่นคือการติดตั้งneedrestartแพคเกจ

sudo apt-get install needrestart
sudo needrestart -k

ดูเหมือนว่าจะทำงานแม้ว่าจะติดตั้ง needartart หลังจากเคอร์เนลได้รับการอัพเกรด


1
ย่อหน้าแรกของคุณมีความสัมพันธ์กับเวอร์ชันของ Ubuntu อย่างไร
Muru

จุดดี. ขอบคุณ ฉันใช้เวลานานในการทดสอบและลองแพ็คเกจที่ฉันพลาดไป ฉันแก้ไขให้ชัดเจนขึ้นและรวมถึงข้อมูลแพคเกจ ubuntu
Tim Bray

ย้อนกลับไปที่ 8.04 หลังจากการอัพเดตที่จำเป็นต้องรีสตาร์ท Cog จะเปลี่ยนเป็นสีแดง ฉันจะทำให้พฤติกรรมนั้นกลับมาได้อย่างไร
PenguinCSC

Ubuntu 14.04 ฉันได้รับdpkg-query: no packages found matching linux-image-*
the_nuts

Unknown option: kใน Ubuntu 14.04
Cees Timmerman

7

ฉันได้เพิ่มสิ่งต่อไปนี้ในไฟล์. bash-aliases ของฉัน:

alias rr='if [ -f /var/run/reboot-required ]; then echo "reboot required"; else echo "No reboot needed"; fi'

ดูเหมือนง่ายกว่าการติดตั้งแพคเกจสำหรับงานที่ค่อนข้างง่ายนี้ จากนั้นฉันก็วิ่ง:

you@somewhere:~$ rr
No reboot needed
you@somewhere:~$ 

1

วิธีการแก้ปัญหาของคนจน:

#!/bin/bash
default=$(sed -n 's/^default[   ]*\([0-9][0-9]*\).*/\1/p' /boot/grub/menu.lst | tail -1)
if [ "$default" = "" ]; then default=0; fi

want=$(sed -n 's/^kernel[       ]*\/boot\/vmlinuz-\([^  ]*\).*/\1/p' /boot/grub/menu.lst | sed -n "$((default+1))p")

running=$(uname -r)

if [ "$running" = "$want" ]
then
        : OK, do nothing
else
        echo "Running $running, want $want. Reboot required."
fi

(หมายเหตุ: ทั้งสามกรณีของวงเล็บเหลี่ยมที่มีช่องว่างภายในควรเป็น "[<space> <tab>]")


ด้วง 2 ไม่ได้ใช้ /boot/grub/menu.lst อีกต่อไป แต่เป็น /boot/grub/grub.cfg ทันที
Marius Gedminas

-1

ไม่ได้เป็นคำตอบให้กับคำถาม แต่ข้อแม้เกี่ยวกับหลายของการตอบสนอง: /var/run/reboot-requiredคือไม่ได้เป็นแหล่งที่เชื่อถือได้ของหรือไม่จำเป็นต้องรีบูตจริง

ทดสอบอย่างง่าย: เมื่อเคอร์เนลใหม่พร้อมใช้งานติดตั้งรีบูต หลังจากรีบูตให้วิ่งapt autoremoveเพื่อกำจัดเมล็ดเก่าที่ไม่ต้องการอีกต่อไป หลังจากที่คุณเรียกใช้แล้วจะระบุว่าจำเป็นต้องรีบูตซึ่งเป็นเรื่องไร้สาระสมบูรณ์


3
เอาเคอร์เนลออกมาใหม่จะสร้างไฟล์กำหนดค่าด้วงของคุณขึ้นมาหลังจากนั้นก็ควรรีบูตเพื่อตรวจสอบว่าคุณยังสามารถบู๊ตได้ อย่างน้อยนั่นเป็นวิธีที่ฉันแสดงให้เห็นถึงคุณสมบัติ (mis) นี้กับตัวเอง
Marius Gedminas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.