พื้นหลังงาน (เช่นเริ่มต้นด้วย &) ยังมี 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