ฉันสามารถรีสตาร์ท systemd โดยไม่ต้องรีบูตเครื่องหรือไม่


39

ฉันพยายามเริ่มบริการใหม่หลังจากใช้งานyum updateRHEL 7.4 ฉันสามารถเริ่มบริการทุกครั้งโดยใช้ systemctl แต่needs-restartingจากyum utilsบอกฉันว่าฉันควรรีสตาร์ท systemd เอง:

# needs-restarting
1 : /usr/lib/systemd/systemd --system --deserialize 21

ฉันสามารถรีสตาร์ทsystemdโดยไม่ต้องรีบูตเซิร์ฟเวอร์และจะทำอย่างไร

ฉันพบบางอย่างที่กล่าวถึงsystemctl daemon-reloadแต่นี่ไม่ได้ทำให้หายไปจากรายการความต้องการเริ่มต้นใหม่

คำตอบ:


43

หากต้องการรีสตาร์ท daemon ให้รัน

systemctl daemon-reexec

นี้ถูกบันทึกไว้ในmanpage :systemctl

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

น่าเสียดายที่needs-restartingไม่สามารถระบุsystemdได้ว่าได้รีสตาร์ทจริง systemd execsตัวเองเพื่อรีสตาร์ทซึ่งไม่ได้รีเซ็ตเวลาเริ่มต้นของกระบวนการ แต่needs-restartingเปรียบเทียบปรับเปลี่ยนเวลาปฏิบัติการที่มีเวลาเริ่มต้นของกระบวนการในการตรวจสอบว่าความต้องการของกระบวนการที่จะเริ่มต้นใหม่ (ในหมู่สิ่งอื่น ๆ ) และผลที่ตามมาก็มักจะเห็นว่าsystemdความต้องการที่จะเริ่มต้นใหม่ ... การตรวจสอบว่าsystemdมันจะต้องมีการเริ่มต้นใหม่ คุณสามารถตรวจสอบผลลัพธ์ของlsof -p1 | grep deleted: systemdใช้ไลบรารีlibsystemd-sharedซึ่งจัดส่งในแพ็คเกจเดียวกันและได้รับการอัปเกรดพร้อมกับ daemon ดังนั้นหากsystemdจำเป็นต้องรีสตาร์ทคุณจะเห็นว่าใช้ไลบรารีเวอร์ชันที่ถูกลบ หากlsofไม่แสดงไฟล์ที่ถูกลบsystemdไม่จำเป็นต้องรีสตาร์ท (ขอบคุณJeff Schallerสำหรับคำใบ้!)


1
@Raman daemon-reexecควรทำงานแม้จะsystemdเป็น pid 1
Stephen Kitt

3
ปมของความต้องการเริ่มต้นใหม่เดือดลงไปที่github.com/rpm-software-management/yum/blob/master/ …ที่มันสอบถาม PID "start_time" หาก daemon-reexec ไม่อัปเดตความต้องการเริ่มต้นใหม่จะยังคง "สับสน"
Jeff Schaller

1
อย่าคิดว่า codepath ใด ๆ ที่เกี่ยวข้องนั้นผ่านการทดสอบเป็นอย่างดีโดยเฉพาะอย่างยิ่งในระบบที่ไม่ใช่ RedHat เป็นไปได้ในทางเทคนิคที่จะเรียกใช้ daemon-reexec แต่จะปลอดภัยกว่าในการรีบูต
Harald

2
@Harald มันใช้ทุกครั้งที่ใครก็ตามอัพเกรดsystemdเดเบียนและอนุพันธ์ดังนั้นจึงผ่านการทดสอบเป็นอย่างดี มันยังตรงไปตรงมาพอสมควร (มองหาdo_reexecute)
สตีเฟ่น Kitt

1
@StephenKitt - เมื่อฉันพยายามที่จะเรียกเอาท์พุทต่อไปนี้จะถูกสร้างขึ้นlsof -p1 | grep deleted lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs Output information may be incompleteในการอ่าน ( unix.stackexchange.com/questions/171519/ … ) ปรากฏว่าแม้รากไม่สามารถเข้าถึงได้ ทางเลือกจะเป็นlsof -p1 | grep deletedอย่างไร
แรงบันดาลใจ

2

ในกรณีของฉันฉันเพิ่งอัพเกรดsystemdและsystemctlคำสั่งใด ๆล้มเหลว:

# systemctl daemon-reexec
Failed to reload daemon: Access denied
# systemctl status
Failed to read server status: Access denied

อย่างไรก็ตามตามinitmanpage คุณสามารถทำสิ่งเดียวกันโดยส่งSIGTERMdaemon ที่ทำงานเป็น PID 1 ซึ่งทำงาน:

kill -TERM 1

นี่เป็นการโหลด daemon ใหม่หลังจากที่systemctlคำสั่งทั้งหมดเริ่มทำงานอีกครั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.