วิธีเริ่มบริการอัตโนมัติใน Boot ใน RHEL / CentOS 7 ได้อย่างไร

สงสัยวิธีการจัดการบริการในพื้นหลังหรือในการบูต?


กลไกสำหรับการจัดการและกระบวนการเริ่มต้นในการบูตมีการเปลี่ยนแปลง จนกระทั่ง RHEL / CentOS 6.x คุณจะต้องสร้างสคริปต์ใน /etc/init.d/ และเปิดใช้งานด้วยความช่วยเหลือของ chkconfig แต่สิ่งต่าง ๆ บน RHEL 7.

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

systemd คืออะไร?

เนื่องจากทุกกระบวนการใน Linux สามารถมองเห็นได้อย่างชัดเจนเรามาดูว่า systemd ซ่อนอยู่ที่ไหน ในระบบของฉันฉันได้รับสิ่งต่อไปนี้:

~ $ ps -ef | grep systemd
รูท 1 0 0 พ.ย. 54 00:01:02 / lib / systemd / systemd –system –deserialize 22
ข้อความ + 768 1 0 พ.ย. 54? 00:05:46 / usr / bin / dbus-daemon –system –address = systemd: –nofork –nopidfile –systemd-activation –syslog-only
root 805 1 0 พ.ย. 54 00:10:22 / lib / systemd / systemd-logind
อันกุช 1132 1 0 พ.ย. 54? 00:00:00 / lib / systemd / systemd –user
ankush 1176 1132 0 Nov11? 00:04:50 / usr / bin / dbus-daemon –session –address = systemd: –nofork –nopidfile –systemd-activation –syslog เท่านั้น
ankush 9772 20029 0 21:11 แต้ม / 6 00:00:00 grep –color = auto systemd
systemd + 17298 1 0 พ.ย. 19? 00:00:12 / lib / systemd / systemd- แก้ไขแล้ว
systemd + 17303 1 0 พ.ย. 19? 00:00:00 / lib / systemd / systemd-timesyncd
รูต 17307 1 0 พ.ย. 19? 00:00:02 / lib / systemd / systemd-journald
รูต 18182 1 0 พ.ย. 19? 00:00:00 / lib / systemd / systemd-udevd

ฉันพนันว่าคุณสังเกตเห็นมันทันที กระบวนการแรกในรายการถูกเรียกใช้ในฐานะรูทผู้ใช้และมี pid 1.

นี่เป็นกระบวนการแรกที่ระบบเปิดใช้เมื่อเริ่มระบบ ทักทายกับ systemd ��

ดังนั้นค่อนข้างง่าย systemd เป็นกระบวนการ“ แม่” ที่เรียกใช้จัดการและยุติกระบวนการอื่น ๆ ในระบบนอกเหนือจากการให้ข้อมูลเกี่ยวกับการบันทึกสถานะระบบไฟล์ ฯลฯ.

หมายเหตุเกี่ยวกับชื่อแม้ว่า ชื่อนั้นเป็น systemd และไม่ใช่ System D หรืออย่างอื่น “ d” หมายถึง daemon กระบวนการ Linux มาตรฐานที่ใช้งานได้ (แฝงตัวอยู่) ในพื้นหลังและไม่ได้เชื่อมต่อกับเซสชันเทอร์มินัลใด ๆ.

ทำไม RHEL เปลี่ยนเป็น systemd?

ดังที่เราได้กล่าวไปแล้ว systemd เป็นผู้จัดการระบบและกระบวนการและใน RHEL 7 แทนที่โปรแกรมที่รู้จักกันดี Upstart ทำไม RHEL (Oracle?) จึงตัดสินใจเช่นนี้? มีเหตุผลที่ดีสำหรับเรื่องนี้ดังนั้นลองมาดูกัน.

การเริ่มต้นบริการแบบขนาน

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

การจัดการบริการแบบไดนามิก (ร้อน)

หากคุณสังเกตเห็นว่าไดรฟ์ USB จำเป็นต้องได้รับการติดตั้งอย่างชัดเจนในระบบ Fedora ก่อนหน้านี้ในขณะที่พวกเขาจะเปิดโดยอัตโนมัติบน Ubuntu และการกระจายที่คล้ายกันเหตุผลคือ systemd สามารถตรวจจับการเปลี่ยนแปลงที่เกิดขึ้นจริงในฮาร์ดแวร์และยกเลิก / เปิดบริการได้ตามต้องการ บางคนอาจโต้แย้งว่าไม่จำเป็น แต่สำหรับหลาย ๆ คนสิ่งใดก็ตามที่ช่วยลดภาระการรับรู้ได้รับการต้อนรับมากที่สุด.

การเปิดตัวบริการที่ถูกเลื่อนออกไป

systemd ทำให้เวลาการบู๊ตสั้นลงเนื่องจากสามารถเลื่อนการเปิดใช้บริการไปเมื่อจำเป็น ตัวอย่างง่ายๆคือบริการที่เกี่ยวข้องกับระบบไฟล์ในเครือข่าย หากไม่มีดิสก์เครือข่ายให้ใช้งานคุณจะไม่สามารถใช้บริการได้.

การสื่อสารกระบวนการที่เร็วขึ้น

ความสามารถแบบขนานของ systemd นำพาไปสู่การสื่อสารระหว่างกระบวนการ systemd สามารถเสนอการเข้าถึงแบบขนานกับซ็อกเก็ตและบัสระบบลดเวลารอกระบวนการสำหรับทรัพยากรการสื่อสารได้อย่างมาก.

รีสตาร์ทอัตโนมัติ

หากบริการขัดข้อง systemd สามารถตรวจจับสิ่งนั้นและพยายามเริ่มต้นใหม่ ส่วนใหญ่แล้วการรีสตาร์ทอย่างง่ายเป็นสิ่งที่จำเป็นสำหรับแอปพลิเคชันเพื่อเริ่มทำงานอีกครั้งเว้นแต่จะมีปัญหาพื้นฐานมากขึ้น.

อย่างไรก็ตาม systemd ทำให้ชีวิตของดูแลระบบง่ายขึ้นที่นี่.

systemd ใน RHEL7 – การเปลี่ยนแปลงอะไรสำหรับ Sysadmins?

หากคุณมีความรู้สึกที่ดุด่าว่า systemd จะไม่เป็นเสียงระฆังและเสียงดังคุณก็พูดถูก มีความเข้ากันไม่ได้ที่สำคัญบางอย่างที่สามารถจับระบบการดูแล RHEL ด้วยความประหลาดใจ ลองดูอย่างรวดเร็ว.

การสนับสนุน runlevel จำกัด

systemd มีการรับรู้ที่ค่อนข้างโทรมและการสนับสนุนสำหรับ runlevels ไม่รองรับ runlevels ทั้งหมดและสำหรับบางเป้าหมายอาจไม่มีเลย ในกรณีเช่นนี้ systemd จะคืนค่า“ N” เป็นการตอบสนองต่อคำสั่ง runlevel แสดงว่าไม่มี runlevel ที่สอดคล้องกับเป้าหมายนี้ โดยรวมแล้ว Red Hat แนะนำให้เราไม่ใช้ (!) คำสั่ง runlevel.

ไม่มีคำสั่งที่กำหนดเอง

อันนี้จะเจ็บ ข้อดีอย่างหนึ่งของ SysV คือความสามารถในการกำหนดคำสั่งที่กำหนดเองเพื่อมอบฟังก์ชันการทำงานที่ดีขึ้นสำหรับการจัดการกระบวนการ ด้วย systemd ไม่มีตัวเลือกดังกล่าวและคุณติดอยู่กับการเริ่มต้นหยุดสถานะเริ่มต้นใหม่และอื่น ๆ.

เหมาะสำหรับครอบครัวและไม่โต้ตอบ

systemd (แน่นอน) ติดตามกระบวนการที่เปิดตัวและจัดเก็บ PID ของพวกเขา อย่างไรก็ตามความท้าทายคือ systemd ไม่สามารถจัดการกับกระบวนการที่ไม่ได้เปิดใช้ นอกจากนี้ผู้ใช้ไม่สามารถโต้ตอบกับกระบวนการที่เริ่มต้นโดย systemd เป็นไปไม่ได้ เอาต์พุตทั้งหมดไปที่ / dev / null ทำให้หยุดความหวังใด ๆ ได้อย่างมีประสิทธิภาพซึ่งคุณอาจเคยได้จับเอาท์พุท.

ไม่มีบริบท

ต่างจากบริการเริ่มต้นที่เปิดโดย systemd ไม่ได้สืบทอดสภาพแวดล้อมใด ๆ จากผู้ใช้ในระบบ กล่าวอีกนัยหนึ่งคือข้อมูลเช่น PATH และตัวแปรระบบอื่น ๆ จะไม่พร้อมใช้งานและทุกกระบวนการใหม่จะเปิดตัวในบริบทที่ว่างเปล่า.

หากรายการข้อ จำกัด นี้ทำให้คุณร้องไห้อีกครั้งคุณจะไม่โดดเดี่ยว systemd เป็นพลังโพลาไรเซชันในโลก Linux และ Googling ในเรื่อง “systemd sucks” จะทำให้วัสดุการอ่านจำนวนมากถูกค้นพบ ��

วิธีการเริ่มบริการโดยอัตโนมัติเมื่อไม่ทำงาน?

นี่คือกรณีการใช้งานทั่วไปที่ค่อนข้างสวยในการปรับใช้ เราจำเป็นต้องกำหนดโปรแกรมในภาษาที่ไม่มีกระบวนการที่ใช้เวลานาน: PHP! สมมติว่าฉันเขียนสคริปต์ PHP เพื่อจัดการการเชื่อมต่อ websocket ขาเข้า (เราได้สร้างแอพแชทขึ้นมา!) และสคริปต์จะอยู่ที่ /home/ankush/chat_server/index.php.

เนื่องจากการเชื่อมต่อ websocket สามารถเข้าถึงเซิร์ฟเวอร์ได้ตลอดเวลากระบวนการนี้จึงต้องมีการปรับปรุงตลอดเวลาและตรวจสอบการเชื่อมต่อขาเข้า เราไม่สามารถมีวงจรการใช้งาน PHP แบบดั้งเดิมได้ที่นี่เพราะ WebSockets เป็นการเชื่อมต่อที่ไม่ต่อเนื่องและหากสคริปต์ตายแสดงว่าการเชื่อมต่อนั้นเป็นรายการ อย่างไรก็ตามเพียงพอใน websockets; มาดูกันว่าเราจะทำอย่างไรให้ดีมอนเขียนสคริปต์นี้ผ่าน systemd.

บริการ systemd ทั้งหมดอยู่ใน / etc / systemd / system ดังนั้นให้สร้างไฟล์ที่นั่นเพื่ออธิบายสคริปต์เซิร์ฟเวอร์ websocket ของเรา สมมติว่าคุณล็อกอินเป็นผู้ใช้รูท.

# vi /etc/systemd/system/chat_server.service

จากนั้นจำเป็นต้องใช้สิ่งต่อไปนี้.

[Unit]
คำอธิบาย = บริการเซิร์ฟเวอร์การแชท
หลังจาก = network.target

[บริการ]
type = ง่าย
ผู้ใช้ = Ankush
ExecStart = php /home/ankush/chat_server/index.php
เริ่มต้นใหม่ = ในการยกเลิก

[ติดตั้ง]
WantedBy = multi-user.target

บันทึกไฟล์และขั้นตอนต่อไปคือการโหลด systemd daemon

# systemctl daemon-reload

และเพื่อเริ่มบริการที่เราเพิ่งสร้างขึ้น:

# systemctl เริ่มแชท _ เซอร์เวอร์

หากคุณไม่เห็นข้อผิดพลาดนั่นก็คือ!

มาดูกันอย่างรวดเร็วว่าคำสั่งต่าง ๆ ในไฟล์นั้นหมายถึงอะไร:

  • ส่วน [หน่วย] กำหนดหน่วยบริการใหม่สำหรับ systemd ใน systemd parlance บริการทั้งหมดเรียกว่าหน่วยบริการ.
  • คำสั่ง After (คาดการณ์ได้) จะบอกให้ systemd เปิดใช้บริการนี้หลังจากเปิดใช้บริการเครือข่ายแล้ว (ใครจะจัดการกับการเชื่อมต่อซ็อกเก็ตระดับล่าง?!).
  • Type = simple บอก systemd ว่าบริการนี้ไม่ควรแยกเอง กล่าวอีกนัยหนึ่งอินสแตนซ์เดียวเท่านั้นที่จะทำงานในเวลาที่กำหนด.
  • User = ankush หมายถึงบริการนี้จะทำงานในฐานะผู้ใช้“ ankush” เราสามารถเปลี่ยนสิ่งนี้เป็น “รูท” แต่ก็ไม่ได้รับการแนะนำอย่างมากจากมุมมองด้านความปลอดภัย.
  • ExecStart อย่างที่คุณสามารถบอกได้ว่าเป็นคำสั่งจริงที่จะเรียกใช้.
  • เริ่มใหม่ = บนยกเลิกหมายความว่าบริการควรเริ่มต้นใหม่เมื่อยกเลิก ใน PHP กระบวนการที่ใช้เวลานานทำให้หน่วยความจำรั่วและในที่สุดก็ระเบิดออกดังนั้นสิ่งนี้จึงจำเป็น.
  • WantedBy = directive บอก systemd ว่าบริการนี้เป็นส่วนใดของเป้าหมาย (คิดถึงกลุ่ม) ผลลัพธ์นี้มีลิงก์สัญลักษณ์ถูกสร้างขึ้นภายในเป้าหมายนั้นเพื่อชี้ไปยังบริการ.

โดยทั่วไปจะเพียงพอสำหรับการเรียกใช้กระบวนการพื้นหลังโดยใช้ systemd ใน RHEL 7.

ตัวเลือกเพิ่มเติมสำหรับตรรกะรีสตาร์ท

ในตัวอย่างด้านบนฉันได้กำหนดค่า Restart = on-abort แล้ว แต่นั่นไม่ใช่ตัวเลือกเดียว มีมากขึ้นและเลือกตามความต้องการ.

  • ในความล้มเหลว – จะถูกรีสตาร์ทเมื่อรหัสทางออกหรือสัญญาณไม่สะอาด
  • เสมอ – รีสตาร์ทเมื่อพบสัญญาณสะอาดหรือไม่สะอาด
  • ในความผิดปกติ – สัญญาณไม่สะอาดสุนัขเฝ้าบ้านหรือหมดเวลา
  • ในความสำเร็จ – เฉพาะเมื่อมันถูกหยุดโดยสัญญาณที่สะอาดหรือรหัสทางออก

การกำหนดค่าบริการเพื่อเริ่มต้นในการบูต

เมื่อคุณพอใจกับสคริปต์และตรวจสอบให้แน่ใจว่ามันใช้งานได้แล้วคุณจะต้องกำหนดค่าเพื่อให้มันเริ่มทำงานในการบูตและเริ่มต้น.

ไปที่ / etc / systemd / system และดำเนินการคำสั่ง enable ด้านล่าง (อย่าลืมเปลี่ยนชื่อไฟล์. service ด้วยชื่อที่คุณมี)

# systemctl เปิดใช้งาน chat_server.service

คุณจะเห็นการยืนยันว่าได้สร้าง symlink.

สร้าง symlink จาก /etc/systemd/system/multi-user.target.wants/chat_server.service เป็น /etc/systemd/system/chat_server.service.

รีสตาร์ทเซิร์ฟเวอร์ของคุณและคุณจะเห็นว่าบริการเริ่มต้นในการบู๊ต.

นั่นง่ายมาก! ไม่เป็นเช่นนั้น?

ช่วยด้วย! ฉันลงทุนอย่างมหาศาลในการพุ่งพรวด ��

ฉันเข้าใจว่าคุณเชื่อฉันกรณีของคุณเป็นบรรทัดฐานมากกว่าข้อยกเว้น RHEL ใช้งาน Upstart มานานจนสวิตช์เกือบรู้สึกเหมือนถูกหักหลัง แต่เฮ้ระบบต่าง ๆ เปลี่ยนไปและเราไม่ควรทะเลาะกันเรื่องมโนสาเร่ Red Hat ตระหนักดีว่าหลายคนติดอยู่กับรุ่นเก่ากว่าและได้สร้าง คู่มือการโยกย้าย ที่คุณควรพูดถึงอย่างแน่นอน.

ข้อดีข้อหนึ่งในการประหยัดทั้งหมดนี้คือ systemd เข้ากันได้กับสคริปต์ init SysV ดังนั้นส่วนใหญ่คุณจะต้องย้ายไฟล์และรับบริการเดียวกัน.

สนใจที่จะเรียนรู้เพิ่มเติมเกี่ยวกับการดูแลระบบและการแก้ไขปัญหา Linux หรือไม่ ลองดูสิ หลักสูตรออนไลน์.

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map