Tamam, Alex, nokta Linux tüm kullanıcı alanı süreçleri ile başladı olmasıdır init
çalıştırın kimin pid Örneğin 1'dir, sürecin pstree
kimin kökü init edilir senin süreçlerin ağacı görmek için .. birkaç versiyonu vardır init
süreç uygulanması günümüzde en dikkat çekici
- sysVinit (klasik init, hala eski Debian dahil olmak üzere bazı dağıtımlar tarafından kullanılıyor)
- Daha eski Ubuntu ve bazı RHEL (Red Hat) ve daha eski Fedora versiyonları tarafından kullanılan başlatma başlangıcı
- systemd init, modern Fedora, Ubuntu, Debian, RHEL, SUSE versiyonları tarafından kullanılmaktadır.
Geleneksel olarak, Unix'ler, inix olarak adlandırılan init uygulamasını , Unix'in https://ru.wikipedia.org/wiki/UNIX_System_V versiyonunun sysVinit
adıyla kullanır . Çok etkilidir ve diğer girdiler geriye uyumludur.
Temel olarak, sysVinit ilk önce /etc/inittab
dosyayı okur , hangi runlevel'in çalıştırılacağına karar verir ve script'e /etc/init.d/rc
init betiklerini çalıştırmasını söyler . Bir çok kullanıcılı çalışma seviyesi, normal olarak, çizme genellikle • Örneğin, Ubuntu 2 çalışma seviyesi , /etc/init.d/rc
yürütülüyor komut başlatır /etc/rc2.d
. Buradaki dosyalar komut dosyalarına yalnızca sembolik bağlanırken, komut dosyaları kendi /etc/init.d
dizininde saklanır . /etc/rc*.d
Dizinlerdeki bu sembolik bağların isimleri aşağıdaki gibidir. Söyleyin, aşağıdaki komut dosyalarını aldık /etc/rc2.d
:
$ls /etc/rc2.d
S16rsyslog
S17apache2
K02network-manager
Bu, runlevel 2 init işlemine geçişte ilk önce network-manager
işlemleri öldürür , komut dosyasının ismi ile başlar K
- K02network-manager
ve sonra isimleri ile başlayan işlemleri başlatır S
. İki basamak sonra S
veya K
sırasını belirler 00'dan 99'a sayıdır, süreçler içinde başlatılır. Örneğin rsyslog
daha önce başlatılır apache2
, 16 mantıklı az 17 (çünkü, sen apache rsyslog günlüğe kaydetme kapasitesine güvenmek istiyorum çünkü , bu nedenle ilk önce rsyslog başlatılmalıdır). Komut dosyaları, sırayla çalışan kabuk komutlarıdır #!/bin/sh
.
Yani, temelde sysvinit tarzında başlangıçta bir programı başlatmak için, kendi el yazısı yazmak (herhangi bir örnekten onu kopyalamaya karşı yapıştırarak, içeri var /etc/init.d
), koyun /etc/init.d
ve, örneğin makul bir ad altında buna bir sembolik oluşturmak
S99mytrojan
içinde /etc/rc2.d
. İşte /etc/init.d http://docs.oracle.com/cd/E19683-01/806-4073/6jd67r96g/index.html adresindeki tipik sysVinit betiklerinin bir açıklaması
Şimdi, Ubuntu adamları init'ten ek işlevsellik istemelerine karar verdi. Hızlı başlatılan bir işletim sistemi istediler, bu yüzden senaryolarının paralel olarak yürütülmesini istediler; ölü işlemlerin otomatik olarak yeniden başlatılmasını istediler; işlemlerin birbirlerini açık bir şekilde olaylarla çağırmasını istediler (böylece apache "syslog started" olayı tarafından çalıştırılıyor, syslog da "dosya sistemleri monte edilmiş" olayı vb. tarafından çalıştırılıyor, bu yüzden bazı sayılar yerine olaylarımız var 00 -99). Böylece, Upstart'ı başlattılar ve işte böyle çalışıyor. Başlangıcı initscripts /etc/init
dizine konur (karıştırmayın /etc/init.d
). Upstart genellikle çalışır /etc/init.d/rc
, bu yüzden sysVinit scriptlerinizi normal şekilde çalıştırır. Ancak betiğinizin çıkışta yeniden çizilmesini istiyorsanız - Upstart olayları tam size göre.
Senaryomun çalışıp çalışmadığını kontrol edemesem de, sanırım amaçlarınız için aşağıdaki /etc/init/mytrojan.conf
senaryoyu yazmalısınız :
start on runlevel [02]
respawn
exec mytrojan --argument X
Ancak, bağımlılıklara, en azından dosya sistemlerine ve ağa ihtiyacınız varsa, bunun start on runlevel [02]
gibi bir şeyle değiştirmek mantıklı olabilir :
start on (local-filesystems and net-device-up IFACE!=lo)
UYARI: Bunun doğruluğunu kontrol etmedim, çünkü yapamam. Özellikle ağ bağlantınız kurulduktan sonra script'in nasıl başlatılacağından emin değilim ( bu sürümü kullandım ). "Ağda başlatma" için Google'ı deneyin.