มี SystemD เกิดกระบวนการ N


13

ที่องค์กรของฉันเรามีกระบวนการผู้ปฏิบัติงานที่ต้องรอคิวจำนวนมาก ขณะนี้เรากำลังใช้ SupervisorD เพื่อจัดการพวกเขา แต่ต้องการใช้ SystemD หากเป็นไปได้สำหรับข้อดีบางประการในนั้น ฉันค่อนข้างมีประสบการณ์กับการเขียนหน่วยที่กำหนดเอง แต่ฉันไม่ได้มีอะนาล็อกในดินแดน SystemD ในทันที

ในเอกสารประกอบของ SupervisorDพารามิเตอร์ที่เรียกว่าnumprocsมีรายละเอียดซึ่งอนุญาตให้หนึ่งตั้งค่าจำนวนกระบวนการที่ต้องการเริ่มด้วยบริการ ถ้าฉันต้องการเริ่มต้นกระบวนการ 30 กระบวนการมันเป็นการเปลี่ยนแปลงหนึ่งบรรทัด

มีการตั้งค่าในหน่วย SystemD ที่จะอนุญาตให้ฉันระบุจำนวนกระบวนการที่ฉันต้องการเริ่มต้นหรือไม่?


1
คุณกำลังพยายามสร้างหลายอินสแตนซ์ของหน่วยเดียวกันหรือไม่? ถ้าเป็นเช่นนั้นคุณอาจต้องการดู0pointer.de/blog/projects/instances.html
Munir

คำตอบ:


31

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

ก่อนอื่นไฟล์หน่วย /etc/systemd/system/test@.serviceสร้างไฟล์เช่น บิตที่สำคัญคือ@สัญลักษณ์

เนื้อหาอาจมีลักษณะ:

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=multi-user.target

จากนั้นเริ่มต้นด้วย,systemctl start test@1.service กระบวนการที่เปิดตัวจะมีลักษณะดังนี้:systemctl start test@2.service

root     17222  19   0  0.0  0.0 Ss         00:05 /bin/sleep 600 1
root     17233  19   0  0.0  0.0 Ss         00:02 /bin/sleep 600 2

โปรดสังเกตว่าการที่%Iถูกแทนที่ด้วยสิ่งที่คุณใส่หลังจาก@เมื่อคุณเริ่มมัน

คุณสามารถเริ่มต้นทั้ง 30 ด้วย shell-fu เล็กน้อย:

systemctl start test@{1..30}.service

systemctl enable test@1.serviceนอกจากนี้คุณยังสามารถช่วยให้พวกเขาที่บูตเช่นบริการตามปกติใด ๆ

 

ตอนนี้สิ่งที่ฉันหมายถึงสิ่งที่คุณสามารถทำได้เพื่อให้การจัดการง่ายขึ้น: บางทีคุณอาจไม่ต้องการใช้test@{1..30}.serviceเพื่อจัดการมันทั้งหมด มันเป็นเรื่องเล็กน้อยเทอะทะ คุณสามารถสร้างเป้าหมายใหม่สำหรับบริการของคุณแทน

สร้าง/etc/systemd/system/test.targetด้วย:

[Install]
WantedBy=multi-user.target

จากนั้นปรับ/etc/systemd/system/test@.serviceเพื่อให้ดูเหมือนว่า:

[Unit]
StopWhenUnneeded=true

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=test.target

โหลด systemd อีกครั้งด้วยsystemctl daemon-reload(จำเป็นเฉพาะเมื่อคุณแก้ไขไฟล์หน่วยและไม่ข้ามรุ่นก่อนหน้า) systemctl enable test@{1..30}.serviceและตอนนี้เปิดใช้งานบริการทั้งหมดที่คุณต้องการที่จะได้รับการจัดการโดยการทำ
(หากคุณเคยเปิดใช้งานบริการก่อนหน้านี้ให้WantedBy=multi-user.targetปิดการใช้งานก่อนเพื่อล้างการพึ่งพา)

ตอนนี้คุณสามารถทำได้systemctl start test.targetและsystemctl stop test.targetมันจะเริ่ม / หยุดกระบวนการทั้ง 30 และอีกครั้งที่คุณสามารถเปิดใช้งานที่บูตเช่นไฟล์หน่วยงานอื่นใด:
systemctl enable test.target


ขอบคุณสำหรับคำตอบโดยละเอียดฉันค้นหาสิ่งนี้เป็นเวลาหลายวัน
arnolem

1
คุณรู้หรือไม่ว่าจะเริ่มกระบวนการที่ล้มเหลว?
bastian

@bastian: Restart=on-failureคุณสามารถใช้ อ่านsystemd.serviceman page สำหรับข้อมูลเพิ่มเติม
siride

1

นี่คือตัวอย่างของฉันโดยใช้สคริปต์ python ที่ทำงานใน virtualenv:

/etc/systemd/system/my-worker@.service

[Unit]
Description=manages my worker service, instance %i
After=multi-user.target

[Service]
PermissionsStartOnly=true
Type=idle
User=root
ExecStart=/usr/local/virtualenvs/bin/python /path/to/my/script.py
Restart=always
TimeoutStartSec=10
RestartSec=10

ปิดการใช้งาน: sudo systemctl enable my-worker\@{1..30}.service

เปิดใช้งาน N คนงาน: sudo systemctl enable my-worker\@{1..2}.service

โหลด: sudo systemctl daemon-reload

ราคาเริ่มต้น: sudo systemctl start my-worker@2.service

ตรวจสอบสถานะ: sudo systemctl status my-worker@1

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