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.
Ok, Alex, le fait est que tous les processus de l'espace utilisateur sous Linux sont démarrés avec
init
process, dont le pid est 1. Par exemple, lancezpstree
pour voir l'arborescence de vos processus, dont la racine est init. Il existe plusieurs versions de l'init
implémentation de processus de nos jours , les plus notables sontTraditionnellement, Unix utilisait une implémentation init appelée
sysVinit
init, 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/inittab
fichier, décide du niveau d'exécution à exécuter et indique au/etc/init.d/rc
script 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/rc
commence à 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.d
répertoire. Le nom de ces liens symboliques dans les/etc/rc*.d
répertoires est le suivant. Disons, nous avons les scripts suivants dans/etc/rc2.d
:Cela signifie que lors du passage au niveau d'exécution 2, le processus d'initialisation tue d'abord les
network-manager
processus, car son nom de script commence parK
-K02network-manager
puis démarre les processus dont les noms commencent parS
. Les deux chiffres aprèsS
ouK
est le nombre de 00 à 99, qui détermine l'ordre dans lequel les processus sont démarrés. Par exemple, ilrsyslog
est démarré avantapache2
, 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.d
et créez un lien symbolique vers celui-ci sous un nom raisonnable, par exempleS99mytrojan
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.htmlMaintenant, 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/init
répertoire (ne pas confondre avec/etc/init.d
). Upstart s'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
/etc/init/mytrojan.conf
script suivant :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: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".
la source