ฉันจะเขียนสคริปต์เชลล์ที่ผมอยากจะทำงานเป็นภูตในการเริ่มต้นโดยไม่ต้องใช้เครื่องมือภายนอกเช่นdaemontoolsหรือ daemonize
Linux Daemon การเขียน HOWTO
ตามที่ลินุกซ์ภูตเขียน HOWTOที่เหมาะสมภูตมีลักษณะดังต่อไปนี้:
- ส้อมจากกระบวนการหลัก
- ปิดทั้งหมดอธิบายไฟล์ (เช่น
stdin
,stdout
,stderr
) - เปิดบันทึกสำหรับการเขียน (ถ้ากำหนดค่า)
- เปลี่ยนไดเรกทอรีการทำงานอย่างใดอย่างหนึ่งที่เป็นถาวร (ปกติ
/
) - รีเซ็ตหน้ากากโหมดไฟล์ (umask)
- สร้างSession ID ที่ไม่ซ้ำกัน(SID)
daemonizeบทนำ
daemonizeบทนำไปไกลระบุว่าภูตทั่วไปเพิ่มเติม:
- ยกเลิกการเชื่อมโยงจากเทอร์มินัลการควบคุม (หากมี) และจะละเว้นสัญญาณเทอร์มินัลทั้งหมด
- ยกเลิกการเชื่อมโยงจากกลุ่มกระบวนการ
- จับ
SIGCLD
ฉันจะทำทั้งหมดนี้ในsh
, dash
หรือbash
สคริปต์ด้วยเครื่องมือลินุกซ์ร่วมกันเท่านั้น?
สคริปต์ควรสามารถทำงานบน distros ได้มากที่สุดโดยไม่ต้องมีซอฟต์แวร์เพิ่มเติมแม้ว่าDebianจะเป็นจุดสนใจหลักของเรา
หมายเหตุ:ฉันรู้ว่ามีคำตอบมากมายในเครือข่ายStackExchange ที่แนะนำให้ใช้nohup
หรือsetsid
แต่วิธีการเหล่านี้ไม่ได้จัดการข้อกำหนดทั้งหมดข้างต้น
แก้ไข: ภูต (7) manpageยังช่วยให้คำแนะนำบางส่วนแม้ดูเหมือนจะมีความแตกต่างบางอย่างระหว่างแบบเก่าSysV
ภูตและใหม่กว่าsystemd
คน เนื่องจากความเข้ากันได้กับความหลากหลายของ distros เป็นสิ่งสำคัญโปรดตรวจสอบให้แน่ใจว่าคำตอบนั้นชัดเจนแตกต่างกัน
daemon
และสิ่งอื่น ๆ เหล่านั้นมีการทำงานโดยพลสคริปต์เปลือกไม่มีบทบัญญัติสำหรับการทำงานเป็น ภูต เนื่องจากคุณเป็นผู้แต่งควบคุมการเขียนสคริปต์ให้สมบูรณ์ดังนั้นจึงสามารถเปิดใช้งานได้จาก systemd unitfile หรือสคริปต์ rc.d คุณไม่ระบุ "เหมาะสม"!