Ok, Alex, chodzi o to, że wszystkie procesy przestrzeni użytkownika w Linuksie są uruchamiane z init
procesem, którego pid wynosi 1. Na przykład uruchom, pstree
aby zobaczyć drzewo swoich procesów, których rootem jest init. Obecnie istnieje kilka wersji init
implementacji 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 sysVinit
init, 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/inittab
plik, decyduje, który poziom uruchamiania ma uruchomić, i nakazuje /etc/init.d/rc
skryptowi 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/rc
uruchamia się w nim skrypt /etc/rc2.d
. Pliki zawierają tylko symboliczne łącza do skryptów, podczas gdy same skrypty są przechowywane w /etc/init.d
katalogu. Nazwy tych dowiązań symbolicznych w /etc/rc*.d
katalogach 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-manager
procesy, ponieważ jego nazwa skryptu zaczyna się od K
- K02network-manager
a następnie uruchamia procesy, których nazwy zaczynają się od S
. Dwie cyfry po S
lub K
są liczbą od 00 do 99, która określa kolejność, w której procesy są uruchamiane. Np. rsyslog
Jest 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.d
i utworzyć dowiązania do niego pod odpowiednim nazwy, np
S99mytrojan
w /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/init
katalogu (nie mylić z /etc/init.d
). Upstart zwykle /etc/init.d/rc
ró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.conf
skrypt:
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”.