หลังจากทำงาน
sudo pacman -Syyu
หรือ
sudo pacman -S [something to install]
ฉันควรรีสตาร์ทเพื่อให้ปลอดภัยหรือไม่
หลังจากทำงาน
sudo pacman -Syyu
หรือ
sudo pacman -S [something to install]
ฉันควรรีสตาร์ทเพื่อให้ปลอดภัยหรือไม่
คำตอบ:
หากมีการอัพเดตเคอร์เนล glibc หรือ systemd คุณอาจต้องรีสตาร์ทเพื่อใช้งานเวอร์ชันที่อัพเดต หากคุณมีการอัปเดตสภาพแวดล้อมเดสก์ท็อปของคุณการล็อกเอาต์ / ล็อกอินอย่างง่ายก็เพียงพอแล้ว
วิธีที่ดีที่สุดคือค้นหาโปรแกรม / บริการที่ใช้ไลบรารีเก่าและเริ่มต้นใหม่ และคุณสามารถทำได้โดยการแสดงรายการไฟล์ที่ใช้ทั้งหมดโดยใช้ 'lsof' และค้นหาไฟล์ที่มีประเภท 'DEL' DEL หมายถึงชื่อไฟล์ถูกลบออกจากระบบไฟล์ แต่ยังคงติดอยู่ในหน่วยความจำเพราะมีคนใช้งาน
นี่คือบรรทัดคำสั่งแบบเต็ม:
sudo lsof +c 0 | grep 'DEL.*lib' | awk '1 { print $1 ": " $NF }' | sort -u
เหตุผลบังคับสำหรับการรีบูตคือเคอร์เนลใหม่ (และคุณสามารถรีบูตซอฟต์โดยใช้ 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
dbus
systemctl restart sshd
จะไม่เริ่มใหม่ตราบใดที่คุณเชื่อมต่ออยู่ฉันเห็นตัวเลือก 2 ตัว:
systemctl restart sshd
ใช้at/cron/systemd
ตัวจับเวลาSSH
โดยใช้เชลล์ระยะไกล (ปลอดภัย) อื่นเช่นmosh
screen/tmux
อาจบล็อกบริการต่าง ๆ เช่นSSH
เริ่มต้นใหม่วิธีที่ง่ายที่สุดคือปิดเซสชันเหล่านี้ก่อนเริ่มบริการใหม่วิธีที่ง่ายคือการเปรียบเทียบรุ่นของเคอร์เนลที่ใช้งานกับเคอร์เนลล่าสุดบนดิสก์ ฉันพบสคริปต์ที่สามารถทำได้อย่างง่ายดาย
ขณะที่ฉันติดตั้งหลายเมล็ดฉันปรับเปลี่ยนสคริปต์เพื่อตรวจสอบเฉพาะรายการที่สอดคล้องกับเคอร์เนลที่กำลังทำงานอยู่ ตัวอย่างเช่นปัจจุบันฉันมีเวอร์ชัน 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