Come avviare automaticamente un servizio all'avvio di Ubuntu?


31

Sto usando Ubuntu 12.04 e voglio avere un servizio all'avvio, quando il sistema viene avviato normalmente.

Come "servizio" capisco del codice, ad esempio cd my_directory; my_command -host 0.0.0.0 -port 1234 -arg x che dovrebbe essere in esecuzione come se fosse stato avviato dalla riga di comando. Esistono servizi da avviare come utente normale, ma anche servizi da avviare come root (in effetti, non è necessario che i servizi vengano eseguiti a livello di utente).

Ho anche bisogno di configurare il comportamento quando un "servizio" si interrompe. Voglio che vengano riavviati nel mio caso, con lo stesso argomento, in una directory specificata.

Tutti i servizi dovrebbero essere avviati automaticamente all'avvio normale del sistema, ovvero se si preme l'interruttore di alimentazione. Nessuna altra azione dovrebbe essere richiesta.

Ci sono alcuni documenti sparsi su Internet, ma mi confondono tutti. Parlano init, init.d, rc.d, ma non ho mai visto un'istruzione semplice da seguire passo-passo per facilmente come un servizio utilizzando ad esempio upstart. Se questo è facile, apprezzerei se questi passaggi sono indicati qui.

Risposte:


33

Per creare un lavoro da avviare automaticamente all'avvio di Ubuntu, utilizzare l'esempio fornito qui . Come esempio scritto, supponiamo di creare il seguente file /etc/init/testservice.confcon 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

Per avviare o interrompere "manualmente" il processo, utilizzare

sudo start testservice
sudo stop testservice

Vedi i comandi di controllo del lavoro .


Avevo bisogno di "start on Start Mountall" per avviare il servizio.
Martinedwards

23

Ok, Alex, il punto è che tutti i processi di userspace in Linux sono avviati con initprocess, il cui pid è 1. Ad esempio, corri pstreeper vedere l'albero dei tuoi processi, la cui radice è init .. Al initgiorno d'oggi ci sono diverse versioni dell'implementazione del processo , i più notevoli sono

  • sysVinit (init classico, ancora usato da alcune distribuzioni, incluso Debian precedente)
  • Upstart init, usato da Ubuntu precedente e da alcune versioni RHEL (Red Hat) e Fedora precedenti
  • systemd init, utilizzato dalle moderne versioni Fedora, Ubuntu, Debian, RHEL, SUSE

Tradizionalmente, Unix utilizzava l'implementazione di init chiamata sysVinitinit, chiamata con il nome di https://ru.wikipedia.org/wiki/UNIX_System_V versione di Unix. È molto influente e altri init sono retrocompatibili.

Fondamentalmente, sysVinit legge prima il /etc/inittabfile, decide quale runlevel eseguire e dice /etc/init.d/rcallo script di eseguire i cosiddetti script init. Ad esempio, quando normalmente si avvia su un runlevel multiutente, che di solito è runlevel 2 su Ubuntu , /etc/init.d/rcinizia a eseguire gli script /etc/rc2.d. I file contengono solo collegamenti simbolici agli script, mentre gli script stessi sono memorizzati nella /etc/init.ddirectory. La denominazione di tali collegamenti simbolici nelle /etc/rc*.ddirectory è la seguente. Dì, abbiamo i seguenti script in /etc/rc2.d:

$ls /etc/rc2.d
S16rsyslog
S17apache2
K02network-manager

Significa che quando si passa al processo runlevel 2 init prima uccide i network-managerprocessi, perché il suo nome di script inizia con K- K02network-managere quindi avvia i processi, i cui nomi iniziano con S. Le due cifre dopo So Kè il numero compreso tra 00 e 99, che determina l'ordine, i processi vengono avviati. Ad esempio, rsyslogviene avviato prima apache2, perché 16 è inferiore a 17 (ciò ha senso, perché si desidera che Apache faccia affidamento sulle capacità di registrazione di rsyslog , quindi rsyslog dovrebbe essere avviato per primo). Gli script sono script shell casuali, eseguiti da #!/bin/sh.

Quindi, fondamentalmente per avviare un programma all'avvio in stile sysVinit, scrivi il tuo script (copiandolo da qualsiasi esempio, ci sei dentro /etc/init.d), mettilo /etc/init.de crea un link simbolico con un nome ragionevole, ad esempio S99mytrojanin /etc/rc2.d. Ecco una spiegazione dei tipici script sysVinit in /etc/init.d http://docs.oracle.com/cd/E19683-01/806-4073/6jd67r96g/index.html

Ora, i ragazzi di Ubuntu hanno deciso di volere funzionalità aggiuntive da init. Volevano un sistema operativo ad avvio rapido, quindi volevano che i loro script fossero eseguiti in parallelo; volevano che i processi morti fossero riavviati automaticamente; volevano che i processi si invocassero l'un l'altro in modo esplicito dagli eventi (in modo che apache sia gestito dall'evento "syslog avviato", e syslog sia gestito dall'evento "montato sui file system" ecc., quindi abbiamo eventi invece di alcuni numeri 00 -99). Quindi, hanno creato Upstart ed ecco come funziona. Gli initscript upstart vengono inseriti nella /etc/initdirectory (da non confondere /etc/init.d). Anche Upstart di solito funziona /etc/init.d/rc, quindi eseguirà normalmente i tuoi script sysVinit. Ma se vuoi che la tua sceneggiatura venga rigenerata all'uscita, gli eventi Upstart sono per te.

Anche se non riesco a verificare che la mia sceneggiatura funzioni, suppongo che per i tuoi scopi, dovresti scrivere la seguente /etc/init/mytrojan.confsceneggiatura:

start on runlevel [02]
respawn
exec mytrojan --argument X 

Ma se hai bisogno di dipendenze, almeno filesystem e rete, può essere logico sostituirlo start on runlevel [02]con qualcosa come:

start on (local-filesystems and net-device-up IFACE!=lo)

ATTENZIONE: non ho verificato la correttezza di questo, perché non posso. In particolare, non sono del tutto sicuro di come avviare lo script dopo che la connessione di rete è attiva e funzionante (ho usato questa versione ). Prova a cercare su Google "upstart on network up".


1
Questa è una bella panoramica sulla storia del processo avviato in Linux, ma non risponde per domanda. Non so ancora come "creare" un processo iniziale. Voglio anche solo usarlo, non capire minimamente come funziona. Volevo solo avere un esempio di lavoro semplice e facile da usare, su come creare un processo da avviare e rigenerare automaticamente con upstart di ubuntu..l.
Alex

@Alex: aggiornato con uno scipt campione. Nota che la mia sceneggiatura potrebbe benissimo essere sbagliata. L'ho fatto nello spirito di alexreisner.com/code/upstart .
Boris Burkov,

1
È stato votato perché questa è una delle migliori risposte che io abbia mai letto.
user1301428,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.