start-stop-daemon แตกต่างจากการใช้ & & คืออะไร?


18

ฉันกำลังตั้งค่าบริการใน /etc/init.d ฉันกำลังมองหาที่สคริปต์ต่างๆในนั้นบางส่วนจะดำเนินการด้วยและบางคนที่มีstart-stop-daemon .../path/to/script &

ทั้งหมดของพวกเขาบันทึก pid ในไฟล์และทำการตรวจสอบบางอย่าง

แนวปฏิบัติที่ดีที่สุดคืออะไรความแตกต่างอะไรคือสิ่งสำคัญที่ต้องรู้ที่นี่ ... ? (โดยทั่วไป)

ในกรณีของฉันโดยเฉพาะฉันมีเซิร์ฟเวอร์ http localhost แบบเบา ๆ ใน java ที่แอปพลิเคชันจะโทรหนึ่งครั้งทุกชั่วโมงหรือมากกว่านั้นและมันก็ให้หมายเลขสุ่มโง่ ๆ (ไม่มีรายละเอียดเพิ่มเติมที่นี่ฉันแค่หมายความว่าไม่ได้ใช้ระบบไฟล์หรือ หัวข้อหรือสิ่งที่ซับซ้อนในกรณีนี้ในคำถามของฉัน)

ขอบคุณ

คำตอบ:


27

พื้นหลังงาน (เช่นเริ่มต้นด้วย &) ยังมี stdin, stdout และ stderr เชื่อมต่อกับเครื่องที่เริ่มต้นในทันทีมันอาจเขียน (เช่น. ข้อความผิดพลาด) ไปยังเครื่อง ("รบกวน" งานใน เบื้องหน้า) หรือหยุดการรออินพุตจากแป้นพิมพ์ (คุณต้องวางไว้ในเบื้องหน้าก่อน) แน่นอนคุณอาจเปลี่ยนเส้นทาง stdout และ stderr ไปยังไฟล์หรือไปยัง / dev / null เพื่อป้องกันไม่ให้งานพื้นหลังเขียนไปยังเทอร์มินัล

แบ็คกราวน์ - งานสามารถใส่ส่วนหน้าได้ - เช่น โฟร์กราวน์งานปัจจุบันหยุดทำงานและใช้fgคำสั่ง (โฟร์กราวน์) เพื่อวางแบ็กกราวน์งานในโฟร์กราวน์ สามารถเข้าถึงงานพื้นหลังได้โดยสัญญาณจากเทอร์มินัลเช่น SIGHUP เมื่อคุณปิดเทอร์มินัลซึ่งโดยปกติจะสิ้นสุด (ส่วนใหญ่) โปรแกรมที่เริ่มต้นในเทอร์มินัล

daemon - เช่นเดียวกับที่เริ่มต้นโดยอัตโนมัติโดย init.d แต่ยังสามารถเริ่มต้นได้ด้วยตนเองจากเทอร์มินัล - ในทางกลับกันรันการเชื่อมต่อจากเทอร์มินัลใด ๆ แม้ว่าจะเริ่มต้นด้วยตนเองจากเทอร์มินัล daemon จะถูกตัดการเชื่อมต่อจากเทอร์มินัลดังนั้นจึงไม่สามารถเขียน (stdout, stderr) หรืออ่าน (stdin) นอกจากนี้ยังเป็น "ภูมิคุ้มกัน" เพื่อส่งสัญญาณ "โดยอัตโนมัติ" จากสถานี (แม้ว่าคุณสามารถส่งสัญญาณโดยใช้kill -signal pid)

"ความเป็นมา" และ "เบื้องหน้า" หมายถึงสถานะของกระบวนการไปยังเทอร์มินัลบางตัว - แม้ว่ามันจะเป็นกระบวนการควบคุมเทอร์มินัลหรือไม่ก็ตาม เนื่องจาก daemons ไม่ได้เชื่อมต่อกับเทอร์มินัล (แต่ถูกตัดการเชื่อมต่ออย่างมีเหตุผลในทุกวิถีทาง) จึงไม่สามารถกล่าวได้ว่าทำงานในพื้นหลัง Daemons เป็นเพียง processess ที่รันโดยไม่ต้องเชื่อมโยงกับเทอร์มินัล - ไม่อยู่ในพื้นหลังหรือพื้นหลัง

หากคุณใช้psกับตัวเลือกที่แสดงว่ากระบวนการใดที่เทอร์มินัลใช้อยู่คุณจะเห็นว่าทั้งหน้าและแบ็คกราวน์นั้นจะทำการวิเคราะห์ด้วยเทอร์มินัล (เช่น. tty2) Daemons ในทางกลับกันมี "?" ในด้านนี้.

Daemons มักจะเป็นคนมีลักษณะเช่นนี้แม้ว่าพวกเขาจะเริ่มด้วยตนเอง การสร้างภูตของคุณเป็นของตัวเองค่อนข้างจะเป็นเรื่องยาก - มีกลอุบายบางอย่างที่เกี่ยวข้องกับการยกเลิกการเชื่อมต่อโดยสิ้นเชิงจากเทอร์มินัล คุณควรสร้างเป็นผู้ใช้ / กลุ่มของตัวเองเพื่อให้ทำงานได้ โดยปกติคุณจะต้องใช้ / tmp, / var / tmp หรือ / var / run หากคุณต้องการให้มันสร้างไฟล์โดยปกติแล้วมันไม่ควรมีสิทธิ์ใด ๆ เนื่องจากไม่สามารถรายงานข้อผิดพลาดไปยังเทอร์มินัลได้คุณควรให้มันเขียนไปยังไฟล์บันทึก (เช่นเป็นไฟล์บันทึกของตัวเองใน / var / log) Daemons ควรสร้างรายการใน / var / run ด้วย PID ปัจจุบันและควรตรวจสอบว่าอินสแตนซ์อื่นของรายการนั้นกำลังทำงานอยู่หรือไม่ ควรเคารพการล็อค (/ var / lock) สำหรับไฟล์หรืออุปกรณ์ที่เกี่ยวข้อง ควรตอบสนองต่อ SIGHUP โดยการโหลดไฟล์ config อีกครั้งและใช้การกำหนดค่าที่อัปเดต

อีกประเด็นคือ daemons ส่วนใหญ่ทำงานอย่างไร โดยปกติแล้ว daemon จะสามารถเรียกใช้งานได้เพียงครั้งเดียวซึ่งสามารถทำงานในหนึ่งในสองโหมดที่แตกต่างกัน ขึ้นอยู่กับว่ามันเป็นภูตดั้งเดิม - พ่อแม่ - เริ่มต้นตอนบูทหรือด้วยตนเอง ... หรือลูกวางไข่โดยพ่อแม่นี้ กระบวนการหลักมักจะนั่งและรอเหตุการณ์บางอย่าง - เวลาที่กำหนดเวลาผ่านไปความพยายามในการเชื่อมต่อกับพอร์ตเครือข่ายที่เฉพาะเจาะจงหรือสิ่งที่เคย เมื่อสิ่งนี้เกิดขึ้นผู้ปกครองจะสร้างกระบวนการลูกที่เหมือนกันกับตัวเอง (โดยใช้ fork () ระบบเรียก) - และกลับไปทันทีเพื่อรอเหตุการณ์อื่น (และอาจวางไข่เด็กมากขึ้น) มันเป็นกระบวนการลูกซึ่งจะใช้งานได้จริง - เช่นการซิงค์ดิสก์, เรียกใช้คำสั่ง (เช่นcron) หรือสร้างการเชื่อมต่อเครือข่าย (เช่นsshdหรือftpd) ความแตกต่างเพียงอย่างเดียวระหว่างพาเรนต์และลูกคือว่าพวกเขามี PID ต่างกันและ PPID (Parent-PID) ของเด็กนั้นคือ PID ของโพรเซสแม่ - ซึ่งสามารถใช้เพื่อยับยั้งกระบวนการที่เป็นพ่อแม่หรือลูก ดังนั้นกระบวนการเดียวกันจะต้องสามารถทำงานได้ในสองโหมด - ในฐานะผู้ปกครองที่รอ (และวางไข่) หรือเป็นเด็กที่ทำงาน

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

การใช้nohupหรือdisownบนงานแบ็คกราวน์มักเป็นทางเลือกที่ดีพอเพราะจะทำให้กระบวนการทำงานแม้ว่าจะปิดเครื่องก็ตาม มันเป็นความคิดที่ดีที่จะเปลี่ยนเส้นทาง stdout และ stderr ไปเป็นไฟล์หรือไปยัง / dev / null สำหรับโปรแกรมแบบอินเทอร์แอคทีฟมากขึ้นscreenเป็นวิธีที่ดีในการทิ้งบางสิ่งบางอย่างไว้จนกว่าคุณจะต้องการมัน at, batchและcrontabยังเป็นมูลค่าที่จะ concider


1
นอกจากนี้ผมจำได้จากหลักสูตรระบบยูนิกซ์เก่าของฉันว่าเมื่อเปิดตัวจากขั้วเซิร์ฟเวอร์ยังต้องออก [กลุ่มกระบวนการ] ของ [ en.wikipedia.org/wiki/Process_group] เท่าที่ฉันจำได้. เพื่อให้กระบวนการนี้สามารถป้องกันสัญญาณใด ๆ จากเทอร์มินัลดั้งเดิม
yves Baumes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.