ตกลงอเล็กซ์ประเด็นก็คือกระบวนการ userspace ทั้งหมดใน Linux เริ่มต้นด้วยinitโพรเซสซึ่ง pid คือ 1 ตัวอย่างเช่นเรียกใช้pstreeเพื่อดูแผนผังกระบวนการของคุณซึ่งรูทเป็นรากเริ่มต้น .. initกระบวนการปรับใช้กระบวนการมีหลายรุ่นในปัจจุบัน สิ่งที่น่าสังเกตมากที่สุดคือ
- sysVinit (คลาสสิก init ยังคงใช้โดยการแจกแจงบางอย่างรวมถึง Debian ที่เก่ากว่า)
- พุ่งพรวด init ใช้โดย Ubuntu รุ่นเก่าและรุ่น RHEL (Red Hat) และ Fedora รุ่นเก่าบางรุ่น
- systemd init ใช้โดย Fedora รุ่นใหม่, Ubuntu, Debian, RHEL, SUSE version
ตามเนื้อผ้า Unix'es ใช้การใช้งาน init เรียกว่าsysVinitinit เรียกโดยชื่อhttps://ru.wikipedia.org/wiki/UNIX_System_Vเวอร์ชัน Unix มันมีอิทธิพลมากและ inits อื่น ๆ จะย้อนกลับเข้ากันได้กับมัน
โดยทั่วไป sysVinit ก่อนจะอ่าน/etc/inittabไฟล์ตัดสินใจซึ่ง runlevel เพื่อรันและบอก/etc/init.d/rcสคริปต์ให้เรียกใช้สคริปต์ init ที่เรียกว่า เช่นเมื่อมันปกติรองเท้ากับระดับการทำงานแบบ multi-user ซึ่งมักจะrunlevel 2 บน Ubuntu , เริ่มดำเนินการในสคริปต์/etc/init.d/rc /etc/rc2.dไฟล์มีลิงก์เชิงสัญลักษณ์ไปยังสคริปต์เท่านั้นในขณะที่สคริปต์จะถูกเก็บไว้ใน/etc/init.dไดเรกทอรี การตั้งชื่อ symlink เหล่านั้นใน/etc/rc*.dไดเรกทอรีมีดังนี้ บอกว่าเรามีสคริปต์ต่อไปนี้ใน/etc/rc2.d:
$ls /etc/rc2.d
S16rsyslog
S17apache2
K02network-manager
มันหมายถึงว่าเมื่อเปลี่ยนไปใช้กระบวนการ runlevel init 2 ครั้งแรกฆ่าnetwork-managerกระบวนการสาเหตุเริ่มต้นชื่อสคริปต์ด้วยK- และจากนั้นก็เริ่มกระบวนการที่มีชื่อขึ้นต้นด้วยK02network-manager SตัวเลขสองหลักหลังSหรือKเป็นตัวเลขตั้งแต่ 00 ถึง 99 ซึ่งเป็นตัวกำหนดลำดับกระบวนการเริ่มต้นขึ้นเช่นrsyslogเริ่มต้นก่อนapache2เพราะ 16 น้อยกว่า 17 (ที่เหมาะสมแล้วทำให้คุณต้องการอาปาเช่ขึ้นอยู่กับความสามารถในการบันทึกของ rsyslog ดังนั้น rsyslog ควรเริ่มต้นก่อน) สคริปต์สคริปต์เปลือกลำลอง, #!/bin/shดำเนินการโดย
ดังนั้นโดยทั่วไปจะเริ่มต้นโปรแกรมเมื่อเริ่มต้นในรูปแบบ sysvinit เขียนสคริปต์ของคุณเอง (คัดลอกวางจากตัวอย่างใด ๆ ที่คุณได้รับใน/etc/init.d) นำไปใช้/etc/init.dและสร้าง symlink ไปมันภายใต้ชื่อที่เหมาะสมเช่น
ในS99mytrojan /etc/rc2.dนี่คือคำอธิบายของสคริปต์ sysVinit ทั่วไปใน /etc/init.d http://docs.oracle.com/cd/E19683-01/806-4073/6jd67r96g/index.html
ตอนนี้พวก Ubuntu ตัดสินใจว่าพวกเขาต้องการฟังก์ชั่นเพิ่มเติมจาก init พวกเขาต้องการระบบปฏิบัติการบูทที่รวดเร็วดังนั้นพวกเขาจึงต้องการให้สคริปต์ของพวกเขาทำงานแบบขนาน พวกเขาต้องการให้กระบวนการที่ตายแล้วเริ่มต้นใหม่โดยอัตโนมัติ พวกเขาต้องการกระบวนการที่จะเรียกกันอย่างชัดเจนโดยเหตุการณ์ (เพื่อให้ Apache ทำงานโดยเหตุการณ์ "syslog เริ่มต้น" และ syslog ดำเนินการโดยเหตุการณ์ "ติดตั้งระบบไฟล์" ฯลฯ ดังนั้นเราจึงมีเหตุการณ์แทนตัวเลขบางตัว 00 -99) ดังนั้นพวกเขาจึงทำ Upstart และนี่คือวิธีการทำงาน Initscripts พุ่งพรวดจะถูกวางใน/etc/initไดเรกทอรี (อย่าสับสนกับ/etc/init.d) การพุ่งพรวดมักจะทำงาน/etc/init.d/rcด้วยเช่นกันดังนั้นจึงจะดำเนินการกับสคริปต์ sysVinit ของคุณตามปกติ แต่ถ้าคุณต้องการให้สคริปต์ของคุณเกิดขึ้นอีกครั้งเมื่อออก - เหตุการณ์เริ่มต้นสำหรับคุณ
แม้ว่าฉันจะไม่สามารถตรวจสอบได้ว่าสคริปต์ของฉันทำงานได้ แต่ฉันคิดว่าสำหรับจุดประสงค์ของคุณคุณควรเขียน/etc/init/mytrojan.confสคริปต์ต่อไปนี้:
start on runlevel [02]
respawn
exec mytrojan --argument X
แต่ถ้าคุณต้องการการพึ่งพาอย่างน้อยระบบไฟล์และเครือข่ายอาจเป็นเรื่องเหมาะสมที่จะแทนที่start on runlevel [02]ด้วยบางสิ่งเช่น:
start on (local-filesystems and net-device-up IFACE!=lo)
คำเตือน: ฉันไม่ได้ตรวจสอบความถูกต้องของสิ่งนี้เพราะฉันไม่สามารถ โดยเฉพาะอย่างยิ่งฉันไม่แน่ใจเกี่ยวกับวิธีการเริ่มต้นสคริปต์หลังจากการเชื่อมต่อเครือข่ายของคุณทำงานแล้ว (ฉันใช้รุ่นนี้ ) ลองใช้ googling เพื่อ "พุ่งพรวดบนเครือข่ายขึ้น"