Ok, Alex, chodzi o to, że wszystkie procesy przestrzeni użytkownika w Linuksie są uruchamiane z initprocesem, którego pid wynosi 1. Na przykład uruchom, pstreeaby zobaczyć drzewo swoich procesów, których rootem jest init. Obecnie istnieje kilka wersji initimplementacji procesu , najbardziej godne uwagi są
- sysVinit (klasyczny init, wciąż używany przez niektóre dystrybucje, w tym starsze Debian)
- Upstart init, używany przez starsze Ubuntu oraz niektóre RHEL (Red Hat) i starsze wersje Fedory
- systemd init, używany przez współczesne wersje Fedory, Ubuntu, Debian, RHEL, SUSE
Tradycyjnie Unix używa implementacji init o nazwie sysVinitinit, nazywanej nazwą https://ru.wikipedia.org/wiki/UNIX_System_V wersja Unixa. Jest bardzo wpływowy i inne elementy są z nim kompatybilne wstecz.
Zasadniczo sysVinit najpierw czyta /etc/inittabplik, decyduje, który poziom uruchamiania ma uruchomić, i nakazuje /etc/init.d/rcskryptowi wykonanie tak zwanych skryptów inicjujących. Np. Gdy normalnie uruchamia się na poziomie uruchamiania dla wielu użytkowników, którym zwykle jest Ublevu 2 , /etc/init.d/rcuruchamia się w nim skrypt /etc/rc2.d. Pliki zawierają tylko symboliczne łącza do skryptów, podczas gdy same skrypty są przechowywane w /etc/init.dkatalogu. Nazwy tych dowiązań symbolicznych w /etc/rc*.dkatalogach są następujące. Powiedzmy, że mamy następujące skrypty /etc/rc2.d:
$ls /etc/rc2.d
S16rsyslog
S17apache2
K02network-manager
Oznacza to, że po przejściu na proces inicjalizacji poziomu 2 najpierw najpierw zabija network-managerprocesy, ponieważ jego nazwa skryptu zaczyna się od K- K02network-managera następnie uruchamia procesy, których nazwy zaczynają się od S. Dwie cyfry po Slub Ksą liczbą od 00 do 99, która określa kolejność, w której procesy są uruchamiane. Np. rsyslogJest uruchamiany wcześniej apache2, ponieważ 16 jest mniejszy niż 17 (to ma sens, ponieważ chcesz, aby apache polegał na zdolności rejestrowania rsyslog , dlatego rsyslog powinien zostać uruchomiony jako pierwszy). Skrypty są zwykłymi skryptami powłoki wykonywanymi przez #!/bin/sh.
Tak więc, w zasadzie do uruchomienia programu przy starcie w stylu sysvinit napisać własny skrypt (copy-wklejenie go z dowolnego przykład masz w /etc/init.d), umieścić je /etc/init.di utworzyć dowiązania do niego pod odpowiednim nazwy, np
S99mytrojanw /etc/rc2.d. Oto wyjaśnienie typowych skryptów sysVinit w /etc/init.d http://docs.oracle.com/cd/E19683-01/806-4073/6jd67r96g/index.html
Teraz chłopaki Ubuntu zdecydowali, że chcą dodatkowej funkcjonalności od init. Chcieli szybkiego systemu operacyjnego, więc chcieli, aby ich skrypty były wykonywane równolegle; chcieli, aby martwe procesy były automatycznie restartowane; chcieli, aby procesy wywoływały się nawzajem w sposób jawny według zdarzeń (tak, aby apache był uruchamiany przez zdarzenie „uruchamianie syslog”, a syslog był uruchamiany przez zdarzenie „zamontowane w systemie plików” itp., więc mamy zdarzenia zamiast niektórych liczb 00 -99). W ten sposób dokonali Upstart i oto jak to działa. Skrypty startowe są umieszczane w /etc/initkatalogu (nie mylić z /etc/init.d). Upstart zwykle /etc/init.d/rcrównież działa , więc będzie normalnie uruchamiał twoje skrypty sysVinit. Ale jeśli chcesz, aby skrypt był odradzany przy wyjściu - wydarzenia Upstart są dla Ciebie.
Chociaż nie mogę sprawdzić, czy mój skrypt działa, przypuszczam, że dla twoich celów powinieneś napisać następujący /etc/init/mytrojan.confskrypt:
start on runlevel [02]
respawn
exec mytrojan --argument X
Ale jeśli potrzebujesz zależności, przynajmniej systemów plików i sieci, może warto zastąpić start on runlevel [02]coś takiego:
start on (local-filesystems and net-device-up IFACE!=lo)
OSTRZEŻENIE: Nie sprawdziłem poprawności tego, ponieważ nie mogę. Szczególnie nie jestem pewien, jak uruchomić skrypt po uruchomieniu połączenia sieciowego (korzystałem z tej wersji ). Spróbuj googlingu na „upstart on network up”.