Jak automatycznie uruchomić usługę po uruchomieniu Ubuntu?


31

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.

Odpowiedzi:


33

Aby utworzyć zadanie uruchamiane automatycznie po uruchomieniu Ubuntu, skorzystaj z przykładu podanego tutaj . Jak napisano w przykładzie, załóżmy, że należy utworzyć następujący plik za /etc/init/testservice.confpomocą sudo:

# testservice - test service job file

description "my service description"
author "Me <myself@i.com>"

# Stanzas
#
# Stanzas control when and how a process is started and stopped
# See a list of stanzas here: http://upstart.ubuntu.com/wiki/Stanzas

# When to start the service
start on runlevel [2345]

# When to stop the service
stop on runlevel [016]

# Automatically restart process if crashed
respawn

# Essentially lets upstart know the process will detach itself to the background
# This option does not seem to be of great importance, so it does not need to be set.
#expect fork

# Specify working directory
chdir /home/user/testcode

# Specify the process/command to start, e.g.
exec python mycommand.py arg1 arg2

Aby „ręcznie” uruchomić lub zatrzymać proces, użyj

sudo start testservice
sudo stop testservice

Zobacz komendy kontroli zadań .


Potrzebowałem „start on start mountall”, aby uruchomić usługę.
martinedwards

23

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”.


1
To bardzo ładny przegląd historii procesu rozpoczętego w Linuksie, ale nie odpowiada na pytanie. Nadal nie wiem, jak „stworzyć” proces upstart. Chcę też z niego korzystać, nie rozumiem co najmniej o tym, jak to działa. Chciałem po prostu mieć prosty i łatwy w użyciu przykład działania, jak stworzyć proces, który ma być uruchamiany i automatycznie odradzany wraz z aktualizacją Ubuntu.
Alex

@Alex: zaktualizowano o przykładowy scipt. Zauważ, że mój skrypt może być bardzo zły. Zrobiłem to w duchu alexreisner.com/code/upstart .
Boris Burkov

1
Głosowałem, ponieważ jest to jedna z najlepszych odpowiedzi, jakie kiedykolwiek przeczytałem.
user1301428
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.