Korzystam z systemu Ubuntu 12.04 i chcę uruchomić usługę, gdy system zostanie uruchomiony normalnie.
Jako „usługa” rozumiem trochę kodu, na przykład cd my_directory; moja_komenda -host 0.0.0.0 -port 1234 -arg x, które powinny działać tak, jakby zostały uruchomione w wierszu poleceń. Istnieją usługi uruchamiane jako zwykły użytkownik, ale także usługi uruchamiane jako użytkownik root (w rzeczywistości usługi te nie muszą być uruchamiane na poziomie użytkownika).
Wymagam również skonfigurowania zachowania po zatrzymaniu „usługi”. Chcę, aby zostały ponownie uruchomione w moim przypadku, z tym samym argumentem, w określonym katalogu.
Wszystkie usługi powinny zostać uruchomione automatycznie przy normalnym uruchomieniu systemu, tj. Po naciśnięciu wyłącznika zasilania. Żadne inne działanie nie powinno być wymagane.
W Internecie jest kilka dokumentów, ale wszystkie mnie mylą. Mówią o init
, init.d
, rc.d
, ale nigdy nie widziałem dyspozycję proste do wykonania krok po kroku łatwe jako usługi przy użyciu np dorobkiewicz. Jeśli jest to łatwe, byłbym wdzięczny, gdyby te kroki zostały tutaj podane.
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 wersjiinit
implementacji procesu , najbardziej godne uwagi są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
:Oznacza to, że po przejściu na proces inicjalizacji poziomu 2 najpierw najpierw zabija
network-manager
procesy, ponieważ jego nazwa skryptu zaczyna się odK
-K02network-manager
a następnie uruchamia procesy, których nazwy zaczynają się odS
. Dwie cyfry poS
lubK
są liczbą od 00 do 99, która określa kolejność, w której procesy są uruchamiane. Np.rsyslog
Jest uruchamiany wcześniejapache2
, 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, npS99mytrojan
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.htmlTeraz 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: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: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”.
źródło