Comment démarrer un service automatiquement, au démarrage d'Ubuntu?

31

J'utilise Ubuntu 12.04 et je veux qu'un service démarre, lorsque le système est démarré normalement.

En tant que «service», je comprends du code, par exemple cd my_directory; my_command -host 0.0.0.0 -port 1234 -arg x qui devrait juste être exécuté comme s'il avait été démarré sur la ligne de commande. Il existe des services à démarrer en tant qu'utilisateur normal, mais également des services à démarrer en tant que root (en fait, il n'est pas nécessaire que les services soient exécutés au niveau de l'utilisateur).

J'ai également besoin de configurer le comportement lorsqu'un «service» s'arrête. Je veux qu'ils soient redémarrés dans mon cas, avec le même argument, dans un répertoire spécifié.

Tous les services doivent être démarrés automatiquement lorsque le système est démarré normalement, c'est-à-dire si l'interrupteur d'alimentation est enfoncé. Aucune autre action ne devrait être requise.

Il y a des documents diffusés sur Internet, mais ils me confondent tous. Ils parlent init, init.d, rc.d, mais je ne ai jamais vu un simple à suivre les instructions facilement étape par étape en tant que service en utilisant par exemple arriviste. Si cela est facile, j'apprécierais que ces étapes soient indiquées ici.

Alex
la source

Réponses:

33

Pour créer un travail à démarrer automatiquement au démarrage d'Ubuntu, utilisez l'exemple donné ici . Comme exemple écrit, supposons de créer le fichier suivant /etc/init/testservice.confavec sudo:

# testservice - test service job file

description "my service description"
author "Me <[email protected]>"

# 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

Pour démarrer ou arrêter le processus «manuellement», utilisez

sudo start testservice
sudo stop testservice

Voir les commandes de contrôle des travaux .

Alex
la source
J'avais besoin de "démarrer sur mountall démarré" pour démarrer le service.
martinedwards
23

Ok, Alex, le fait est que tous les processus de l'espace utilisateur sous Linux sont démarrés avec initprocess, dont le pid est 1. Par exemple, lancez pstreepour voir l'arborescence de vos processus, dont la racine est init. Il existe plusieurs versions de l' initimplémentation de processus de nos jours , les plus notables sont

  • sysVinit (init classique, toujours utilisé par certaines distributions, y compris l'ancienne Debian)
  • Init de démarrage, utilisé par les anciennes versions d'Ubuntu et de RHEL (Red Hat) et les versions antérieures de Fedora
  • systemd init, utilisé par les versions modernes de Fedora, Ubuntu, Debian, RHEL, SUSE

Traditionnellement, Unix utilisait une implémentation init appelée sysVinitinit, appelée par le nom de la version https://ru.wikipedia.org/wiki/UNIX_System_V d'Unix. Il est très influent et d'autres inits lui sont rétrocompatibles.

Fondamentalement, sysVinit lit d'abord le /etc/inittabfichier, décide du niveau d'exécution à exécuter et indique au /etc/init.d/rcscript d'exécuter les soi-disant scripts init. Par exemple, lorsqu'il démarre normalement vers un niveau d'exécution multi-utilisateurs, qui est généralement le niveau d'exécution 2 sur Ubuntu , /etc/init.d/rccommence à exécuter des scripts dans /etc/rc2.d. Les fichiers ne contiennent que des liens symboliques vers les scripts, tandis que les scripts eux-mêmes sont stockés dans le /etc/init.drépertoire. Le nom de ces liens symboliques dans les /etc/rc*.drépertoires est le suivant. Disons, nous avons les scripts suivants dans /etc/rc2.d:

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

Cela signifie que lors du passage au niveau d'exécution 2, le processus d'initialisation tue d'abord les network-managerprocessus, car son nom de script commence par K- K02network-managerpuis démarre les processus dont les noms commencent par S. Les deux chiffres après Sou Kest le nombre de 00 à 99, qui détermine l'ordre dans lequel les processus sont démarrés. Par exemple, il rsyslogest démarré avant apache2, car 16 est inférieur à 17 (ce qui est logique, car vous voulez qu'Apache s'appuie sur les capacités de journalisation de rsyslog , donc rsyslog doit être démarré en premier). Les scripts sont des scripts shell occasionnels, exécutés par #!/bin/sh.

Donc, fondamentalement, pour démarrer un programme au démarrage dans le style sysVinit, écrivez votre propre script (copiez-collez-le à partir de n'importe quel exemple, vous l'avez entré /etc/init.d), placez-le /etc/init.det créez un lien symbolique vers celui-ci sous un nom raisonnable, par exemple S99mytrojandans /etc/rc2.d. Voici une explication des scripts sysVinit typiques dans /etc/init.d http://docs.oracle.com/cd/E19683-01/806-4073/6jd67r96g/index.html

Maintenant, les gars d'Ubuntu ont décidé qu'ils voulaient des fonctionnalités supplémentaires d'init. Ils voulaient un système d'exploitation à démarrage rapide, ils voulaient donc que leurs scripts soient exécutés en parallèle; ils voulaient que les processus morts soient automatiquement redémarrés; ils voulaient que les processus s'invoquent les uns les autres de manière explicite par des événements (pour que apache soit exécuté par l'événement "syslog démarré", et syslog soit exécuté par l'événement "monté par les systèmes de fichiers" etc., donc nous avons des événements au lieu de quelques chiffres 00 -99). Ainsi, ils ont créé Upstart et voici comment cela fonctionne. Les scripts initiaux sont placés dans le /etc/initrépertoire (ne pas confondre avec /etc/init.d). Upstart s'exécute généralement /etc/init.d/rcaussi, donc ça va exécuter vos scripts sysVinit normalement. Mais si vous voulez que votre script soit réapparu à la sortie - les événements Upstart sont pour vous.

Bien que je ne puisse pas vérifier que mon script fonctionne, je suppose que pour vos objectifs, vous devez écrire le /etc/init/mytrojan.confscript suivant :

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

Mais si vous avez besoin de dépendances, au moins des systèmes de fichiers et du réseau, il peut être judicieux de remplacer start on runlevel [02]par quelque chose comme:

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

AVERTISSEMENT: je n'ai pas vérifié l'exactitude de cela, car je ne peux pas. Surtout, je ne sais pas trop comment démarrer le script une fois que votre connexion réseau est opérationnelle (j'ai utilisé cette version ). Essayez de googler pour "upstart on network up".

Boris Burkov
la source
1
C'est un très bon aperçu de l'historique des processus démarrés sous Linux, mais il ne répond pas par question. Je ne sais toujours pas comment «créer» un processus parvenu. Je veux aussi simplement l'utiliser, ne pas comprendre le moindre détail sur son fonctionnement. Je voulais juste avoir un exemple de travail simple et facile à utiliser, sur la façon de créer un processus à démarrer et à réapparaître automatiquement avec upstart..l d'ubuntu.
Alex
@Alex: mis à jour avec un exemple de scipt. Notez que mon script pourrait très bien être faux. Je l'ai fait dans l'esprit de alexreisner.com/code/upstart .
Boris Burkov
1
A voté parce que c'est l'une des meilleures réponses que j'ai jamais lues.
user1301428