ฉันควรรีสตาร์ทหลังจากการอัพเกรด Pacman หรือไม่


คำตอบ:


10

หากมีการอัพเดตเคอร์เนล glibc หรือ systemd คุณอาจต้องรีสตาร์ทเพื่อใช้งานเวอร์ชันที่อัพเดต หากคุณมีการอัปเดตสภาพแวดล้อมเดสก์ท็อปของคุณการล็อกเอาต์ / ล็อกอินอย่างง่ายก็เพียงพอแล้ว


11

วิธีที่ดีที่สุดคือค้นหาโปรแกรม / บริการที่ใช้ไลบรารีเก่าและเริ่มต้นใหม่ และคุณสามารถทำได้โดยการแสดงรายการไฟล์ที่ใช้ทั้งหมดโดยใช้ 'lsof' และค้นหาไฟล์ที่มีประเภท 'DEL' DEL หมายถึงชื่อไฟล์ถูกลบออกจากระบบไฟล์ แต่ยังคงติดอยู่ในหน่วยความจำเพราะมีคนใช้งาน

นี่คือบรรทัดคำสั่งแบบเต็ม:

 sudo lsof +c 0 | grep 'DEL.*lib' | awk '1 { print $1 ": " $NF }' | sort -u

2
หลังจากสร้างรายการบริการและไลบรารีดังกล่าวก็ยังไม่ชัดเจนว่าบริการ systemd ใดที่ต้องเริ่มต้นใหม่ ดังนั้นแม้ว่าฉันจะรู้ว่ากระบวนการและ libs ใดที่จำเป็นต้องรีสตาร์ท แต่โดยทั่วไปแล้วมันไม่สำคัญเลยที่จะตรวจสอบว่าบริการใดที่จะรีสตาร์ทตามรายการนั้น
bwv549

6

เหตุผลบังคับสำหรับการรีบูตคือเคอร์เนลใหม่ (และคุณสามารถรีบูตซอฟต์โดยใช้ kexec) ดูhttps://wiki.archlinux.org/index.php/Kexecสำหรับรายละเอียดโดยย่อ:

  • โหลดเคอร์เนลใหม่ initramfs และระบุ boot cmdline

    kexec -l /boot/new-kernel --initrd=/boot/new-initramfs --reuse-cmdline
    
  • เรียกใช้kexec(ใช้systemctlสำหรับการปิดที่เหมาะสมkexec -eจะทำงานโดยตรง)

    systemctl kexec
    
  • โปรดทราบว่าหากคุณสร้าง a kexec-load@.serviceตามที่อธิบายไว้ในวิกิถ้าคุณรีบูตเครื่องsystemdจะรีบูตโดยอัตโนมัติโดยใช้kexecแทนการรีบูตไบออส

รุ่นปรับปรุงเล็กน้อยที่ให้ชื่อบริการ systemd:

PIDS="(lsof +c0 -n 2> /dev/null | grep 'DEL.*lib' | awk '{print $2}' | sort -u)"
for PID in $PIDS; do
    systemctl status $i
done | grep '●' | awk '{print $2}' | sort -u

หรือหนึ่งบรรทัด:

for i in $(lsof +c0 -n 2> /dev/null | grep 'DEL.*lib' | awk '{print $2}' | sort -u); do systemctl status $i; done | grep '●' | awk '{print $2}' | sort -u

โปรดทราบว่ามีปัญหาบางอย่าง:

  • systemctl daemon-reload ควรจะดำเนินการก่อนที่จะรีสตาร์ทสิ่งอื่นใด
  • หากsystemdต้องเริ่มต้นPID 1 ( ตัวเอง) ใหม่ก็สามารถทำได้โดยใช้systemctl daemon-reexec
  • systemctl restart dbus.service หยุดบริการอื่น ๆ บางรายการพวกเขาจำเป็นต้องเริ่มต้นใหม่หลังจากการรีสตาร์ท dbus:
    • systemd ตัวเอง: systemctl daemon-reexec
    • systemd-logind
    • systemd-machined
    • อาจ systemd อื่น - * / บริการอื่น ๆ ที่ใช้ (หนัก) dbus
  • หากคุณเชื่อมต่อผ่าน SSH และ SSH จะต้องเริ่มต้นใหม่ แต่systemctl restart sshdจะไม่เริ่มใหม่ตราบใดที่คุณเชื่อมต่ออยู่ฉันเห็นตัวเลือก 2 ตัว:
    • กำหนดการsystemctl restart sshdใช้at/cron/systemdตัวจับเวลา
    • รีสตาร์ทSSHโดยใช้เชลล์ระยะไกล (ปลอดภัย) อื่นเช่นmosh
  • การทำงานscreen/tmuxอาจบล็อกบริการต่าง ๆ เช่นSSHเริ่มต้นใหม่วิธีที่ง่ายที่สุดคือปิดเซสชันเหล่านี้ก่อนเริ่มบริการใหม่
  • ดังที่ได้บอกไว้ในคำตอบก่อนหน้านี้อาจจำเป็นต้องออกจากระบบ / เข้าสู่ระบบโดยเฉพาะอย่างยิ่งสำหรับเซสชันกราฟิก

1
คุณจะช่วยปรับปรุงคำตอบที่อธิบายถึงวิธีการใช้ kexec หรือไม่
Rui F Ribeiro

0

วิธีที่ง่ายคือการเปรียบเทียบรุ่นของเคอร์เนลที่ใช้งานกับเคอร์เนลล่าสุดบนดิสก์ ฉันพบสคริปต์ที่สามารถทำได้อย่างง่ายดาย

ขณะที่ฉันติดตั้งหลายเมล็ดฉันปรับเปลี่ยนสคริปต์เพื่อตรวจสอบเฉพาะรายการที่สอดคล้องกับเคอร์เนลที่กำลังทำงานอยู่ ตัวอย่างเช่นปัจจุบันฉันมีเวอร์ชัน 4.9.79 และ 4.14.16 ติดตั้งอยู่ดังนั้นจึงต้องตรวจสอบ /boot/vmlinuz-4.14-x86_64 น่าเสียดายที่นี่ไม่ทำงานเมื่อฉันเริ่มใช้เวอร์ชัน 5.1 ดังนั้นจึงจำเป็นต้องมีการอัปเดต (แทนที่ 4 ด้วย 3) หรือฉันต้องการค้นหาวิธีที่มีประสิทธิภาพยิ่งขึ้น

นี่คือสคริปต์ของฉัน:

#!/bin/sh
NEXTLINE=0
FIND=""
CURRENT_KERNEL=`uname -r`
KERNEL_PATH="/boot/vmlinuz-${CURRENT_KERNEL:0:4}"
for I in `file $KERNEL_PATH*`; do
  if [ ${NEXTLINE} -eq 1 ]; then
    FIND="${I}"
    NEXTLINE=0
   else
    if [ "${I}" = "version" ]; then NEXTLINE=1; fi
  fi
done
    if [ ! "${FIND}" = "" ]; then
      if [ ! "${CURRENT_KERNEL}" = "${FIND}" ]; then
    echo "Boot required"
  else echo "No boot required"
  fi
fi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.