web-dev-qa-db-fra.com

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

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 de init, init.d, rc.d, mais je n'ai jamais vu une instruction pas à pas simple à suivre facilement comme un service utilisant par exemple parvenu. Si cela est facile, j'apprécierais que ces étapes soient indiquées ici.

32
Alex

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.conf avec 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 commandes de contrôle des travaux .

34
Alex

Ok, Alex, le fait est que tous les processus de l'espace utilisateur sous Linux sont démarrés avec init processus, dont le pid est 1. Par exemple, exécutez pstree pour voir l'arborescence de vos processus, dont la racine is init .. Il existe plusieurs versions de l'implémentation du processus init 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 anciennes versions de Fedora
  • systemd init, utilisé par les versions modernes de Fedora, Ubuntu, Debian, RHEL, SUSE

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

Fondamentalement, sysVinit lit d'abord le fichier /etc/inittab, Décide du niveau d'exécution à exécuter et demande au script /etc/init.d/rc 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 niveau d'exécution 2 sur Ubunt , /etc/init.d/rc commence à exécuter des scripts dans /etc/rc2.d. Les fichiers ne contiennent que des liens symboliques vers des scripts, tandis que les scripts eux-mêmes sont stockés dans le répertoire /etc/init.d. Le nom de ces liens symboliques dans les répertoires /etc/rc*.d Est le suivant. Disons que nous avons les scripts suivants dans /etc/rc2.d:

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

Cela signifie que lors du passage au processus d'initialisation au niveau d'exécution 2, les processus network-manager Sont d'abord détruits, car son nom de script commence par K - K02network-manager, Puis démarre les processus dont les noms commencent par S. Les deux chiffres après S ou K est le nombre de 00 à 99, qui détermine l'ordre dans lequel les processus sont démarrés. Par ex. rsyslog est 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-le depuis n'importe quel exemple, vous avez dans /etc/init.d), Mettez-le dans /etc/init.d Et créez un lien symbolique vers celui-ci sous un nom raisonnable, par exemple S99mytrojan Dans /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 de manière explicite par des événements (pour qu'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 nombres 00 -99). Ainsi, ils ont créé Upstart et ici est comment cela fonctionne. Les scripts initiaux sont placés dans le répertoire /etc/init (Ne pas confondre avec /etc/init.d). Upstart exécute généralement /etc/init.d/rc Aussi, 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 script /etc/init/mytrojan.conf 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 après que votre connexion réseau soit opérationnelle (j'ai utilisé cette version ). Essayez de googler pour "upstart on network up".

23
Boris Burkov