วิธีมาตรฐานหรือวิธีที่ดีที่สุดเพื่อให้กระบวนการมีชีวิตเริ่มต้นโดย init.d


14

ฉันกำลังมองหาวิธีมาตรฐานหรือวิธีปฏิบัติที่ดีที่สุดเพื่อให้ดีมอนเริ่มต้นโดยinit.dเชลล์สคริปต์มีชีวิตอยู่

หรือดียิ่งกว่านี้มีวิธีที่จะทำให้มันมีชีวิตอยู่โดยตรง/etc/init.dหรือไม่

โดยเฉพาะฉันมีดีมอนที่เรียกว่า dtnd with และ infinite loop ที่ค้นหากระบวนการสิ้นสุดที่ไม่คาดคิดหากมี daemon ก็จะปลุกพวกเขาอีกครั้ง นอกจากนี้ฉันใช้เครื่องมือ start-stop-daemon เพื่อให้ precess โดยเรียกใช้จากผู้ใช้ระบบที่กำหนด

ฉันต้องการเรียกใช้ dtnd daemon นี้ตั้งแต่เริ่มต้น เพื่อให้บรรลุพฤติกรรมนี้ฉันสร้างสคริปต์ init.d ที่ "ตัดคำ" ไฟล์ dtnd โดยใช้คำสั่ง start, stop และ status

ฉันมีคำถาม 2 ข้อที่ฉันต้องการแก้ไข:

  1. มีวิธีที่จะทำให้กระบวนการบางอย่างอยู่รอดจากเชลล์สคริปต์init.dหรือไม่ เป็นการปฏิบัติตามมาตรฐาน / วิธีที่ดีที่สุด?

  2. เราขอแนะนำให้รักษากระบวนการให้คงอยู่ด้วยการวนซ้ำแบบไม่สิ้นสุด? ฉันเดาว่าจะใช้คำสั่งบางอย่างดีกว่าrespawnเพื่อให้บรรลุ ถูกต้อง?

ฉันรู้เกี่ยวกับการดำรงอยู่ของrespawnคำสั่ง ผมคิดว่าเป็นสิ่งที่ฉันต้องการ แต่ฉันไม่เข้าใจขั้นตอนการทำงานระหว่างและ/etc/init.d/ /etc/initมีใครช่วยฉันบ้าง

โปรดทราบว่าผมไม่ได้มี inittab พุ่งพรวดค่า (ฉันได้รับอนุญาตให้ใช้งาน/etc/init, /etc/init.d, cronและเครื่องมือระบบstart-stop-daemon. ผมหมายถึงเพียงเครื่องมือเริ่มต้น)

ขอบคุณมากสำหรับเวลาของคุณ!


คำตอบ:


13

ในที่สุดเดเบียนจะมี systemd ดังนั้นนี่คือวิธีที่จะทำบนระบบ Linux ซึ่งใช้ systemd (และหลายคนทำไปแล้วคุณอาจพิจารณาเปลี่ยนดิสทริบิวชัน)

Systemd สามารถจัดการให้บริการอยู่กับคุณโดยอัตโนมัติ ไม่จำเป็นต้องใช้เครื่องมืออื่น ตรวจสอบให้แน่ใจว่าRestart=alwaysได้ตั้งค่าไว้ใน[Service]ส่วนของไฟล์บริการ

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

[Service]
Restart=always
#...everything else...

มีตัวเลือกอื่น ๆ ให้เลือกเช่นกันสำหรับสถานการณ์ที่ซับซ้อนมากขึ้น


2
ในขณะที่อนาคตแสดงตัวเลือกที่ยืดหยุ่นมากขึ้นสิ่งนี้จะดูแลสภาพแวดล้อม / เงื่อนไขปัจจุบันหรือไม่? ดูเหมือนว่าการติดตั้งเครื่องมือจะเป็นเส้นทางที่มีความต้านทานน้อยที่สุดเมื่อเทียบกับการเปลี่ยน / อัพเกรดรถยก
ewwhite

@ ขาวมันขึ้นอยู่กับ Debian มี systemd ตั้งแต่เสียงดัง แต่มันไม่ใช่ init เริ่มต้น มันควรจะเป็นค่าเริ่มต้นจากเจสซี และเนื่องจากผู้ใช้ของเรายอมรับคำตอบฉันคิดว่าเขาใช้ systemd อยู่แล้วด้วยเหตุผลอื่น (หรือได้รับอนุญาตให้ติดตั้ง)
Michael Hampton

systemdดูเหมือนจะทิ้งinit.dสคริปต์และฐานไปแล้ว*.service
ยุเรนเกน

2
แทนที่จะแก้ไขโดยตรงให้ใช้ที่ปลอดภัยกว่าsystemctl edit myserviceจากนั้นsystemctl daemon-reloadรีสตาร์ท myservice
Pablo A

@PabloBianchi การสร้างการแทนที่นั้นใช้ได้ถ้าคุณกำลังเอาชนะหน่วยบริการที่มีอยู่ หากคุณกำลังสร้างหน่วยตั้งแต่เริ่มต้นเช่นเดียวกับที่ OP ทำมันก็ไม่มีประโยชน์
Michael Hampton

3

คุณสามารถเพิ่มเข้าไป/etc/inittabด้วยrespawn:

d1:2345:respawn:/path/to/your/first_daemon arg1 arg2
d2:2345:respawn:/path/to/your/second_daemon arg1 arg2

มันเป็นแฮ็คสกปรก แต่ฉันเคยใช้มันมาก่อนในระบบ sysv-init ที่เก่ากว่า


แต่ daemons ไม่ได้ทำการตั้งค่า () และ fork () ด้วยตนเองเพื่อให้ทำงานในพื้นหลังใช่หรือไม่
symcbean

ขอบคุณ! อย่างที่คุณบอกว่ามันเป็นแฮ็คสกปรก แต่ใช้งานได้ อย่างไรก็ตามฉันชอบการใช้งานของ systemd ตอนนี้ฉันรู้แล้วว่ามันมีอยู่จริง
Adrian Antunez

สิ่งนี้ใช้ไม่ได้ใน RHEL6 ดูเหมือนว่ายูทิลิตี respawn ไม่พร้อมใช้งาน
Djidiouf

2

นั่นเป็นหนึ่งในเหตุผลหลักว่าทำไมเดเบียนถึงย้ายไป systemd

sysvinit (/etc/init.d) ไม่สามารถตรวจพบได้หากบริการไม่ทำงาน / ไม่ตอบสนอง ซึ่งหมายความว่าคุณต้องตรวจสอบบริการเหล่านี้และเลื่อนระดับหากบริการไม่ทำงานของเขาอีกต่อไป

อาจเป็นวิธีที่ง่ายที่สุดที่จะทำคือย้ายไปยัง daemonhandler อื่นเช่น systemd (ค่าเริ่มต้นใน RHEL7 จะเป็นค่าเริ่มต้นใน debian ถัดไปและ Ubuntu ubuntu), พุ่งพรวด (ค่าเริ่มต้นใน RHEL6, Ubuntu 12.04 และ 14.04), daemontools djb) หรืออย่างอื่น

การทำงานเพื่อรักษาบริการให้มีชีวิตจะเป็น PITA ในระบบ sysvinit


1

แนวทางปฏิบัติที่ดีที่สุดคือการทำให้แน่ใจว่า daemons ของคุณไม่หยุดในตอนแรก

ความล้มเหลวที่คุณอาจต้องการดูdaemontoolsของ DJB


3
แน่นอนการปฏิบัติที่ดีที่สุดคือการทำให้แน่ใจว่าภูตของฉันไม่หยุด แต่มีแอพพลิเคชั่นมากมายที่ทำตาม if-I-stop-wake-me เช่น apache2, mysql, samba, pulseaudio ... ฉันกำลังมองหา daemontools และดูเหมือนจะเป็นวิธีที่ดี น่าเสียดายที่ฉันไม่ได้รับอนุญาตให้ติดตั้งเครื่องมือภายนอก ฉันต้องทำโดยใช้ bash scripting หรือ start-stop-daemon และ init.d configs
Adrian Antunez

1

แนวทางมาตรฐานสำหรับฉันคือการใช้Monit utilityสำหรับสิ่งนี้

ฉันไม่สามารถบอกได้เลยจากคำอธิบายของคุณถ้าคุณเขียนบางอย่างเช่น Monit และพยายามทำให้แน่ใจว่ามันกำลังทำงานอยู่หรือถ้าคุณต้องการบางสิ่งบางอย่างเพื่อดูภูตที่คุณสร้างขึ้น


1
สวัสดี ewwhite ฉันต้องให้แน่ใจว่าใบสมัครของฉันมันทำงาน น่าเสียดายที่ฉันไม่ได้รับอนุญาตให้ติดตั้งเครื่องมือภายนอก ฉันต้องทำโดยใช้ bash scripting หรือ start-stop-daemon และ init.d configs
Adrian Antunez

2
@ AdriánAntúnezหากคุณไม่ได้รับอนุญาตให้ติดตั้งเครื่องมือที่คุณต้องใช้ในการทำงานคุณควรแก้ไขปัญหานี้โดยเร็วที่สุด
Michael Hampton

@ AdriánAntúnezคุณถามว่า "standard" Monit เป็นที่รู้จักกันดี / เป็นที่รู้จักกันดี คุณขอคำว่า "ดีที่สุด" ... ข้อ จำกัด ของคุณเป็นเรื่องการเมืองมากกว่า ทำไมคุณไม่อนุญาตให้ติดตั้งซอฟต์แวร์
ewwhite

1
มันไม่ได้เป็นเครื่องมือที่ไม่จำเป็นหรือพึ่งพาถ้ามันไม่สิ่งที่คุณต้องการจะทำ
ewwhite

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