ตกลงอเล็กซ์ประเด็นก็คือกระบวนการ 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 เรียกว่าsysVinit
init เรียกโดยชื่อ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 เพื่อ "พุ่งพรวดบนเครือข่ายขึ้น"