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, lancez pstree
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 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 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
:
$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-manager
processus, 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 exemple, il 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-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 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 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 :
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".