Ok, Alex, der Punkt ist, dass alle Userspace-Prozesse in Linux mit init
process gestartet werden, dessen pid 1 ist. pstree
Sehen Sie sich zum Beispiel den Baum Ihrer Prozesse an, dessen root init ist. init
Heutzutage gibt es mehrere Versionen der Prozessimplementierung am bemerkenswertesten sind
- sysVinit (klassisches Init, das immer noch von einigen Distributionen verwendet wird, einschließlich älterer Debian-Versionen)
- Upstart init, wird von älteren Ubuntu und einigen RHEL (Red Hat) und älteren Fedora-Versionen verwendet
- systemd init, wird von modernen Fedora-, Ubuntu-, Debian-, RHEL- und SUSE-Versionen verwendet
Traditionell verwendeten Unixe die Init-Implementierung sysVinit
init, die unter dem Namen https://ru.wikipedia.org/wiki/UNIX_System_V aufgerufen wurde Version von Unix . Es ist sehr einflussreich und andere Inits sind abwärtskompatibel.
Grundsätzlich liest sysVinit zuerst die /etc/inittab
Datei, entscheidet, welcher Runlevel ausgeführt werden soll, und weist das /etc/init.d/rc
Skript an, sogenannte Init-Skripte auszuführen. ZB wenn es normalerweise zu einem Mehrbenutzer-Runlevel bootet, was normalerweise Runlevel 2 unter Ubuntu ist , /etc/init.d/rc
startet es die Ausführung von Skripten in /etc/rc2.d
. Dateien gibt es nur symbolische Links zu Skripten, während die Skripten selbst im /etc/init.d
Verzeichnis gespeichert sind . Die Benennung dieser Symlinks in /etc/rc*.d
Verzeichnissen lautet wie folgt. Angenommen, wir haben die folgenden Skripte in /etc/rc2.d
:
$ls /etc/rc2.d
S16rsyslog
S17apache2
K02network-manager
Dies bedeutet, dass beim Umschalten auf Runlevel 2 init process zuerst network-manager
Prozesse beendet werden, da sein Skriptname mit K
- K02network-manager
und dann Prozesse startet, deren Namen mit beginnen S
. Die zwei Ziffern nach S
oder K
sind die Zahlen von 00 bis 99, die die Reihenfolge bestimmen, in der die Prozesse gestartet werden. ZB rsyslog
wird sie vorher gestartet apache2
, da 16 kleiner als 17 ist (dies ist sinnvoll, da Sie möchten, dass Apache sich auf die Protokollierungskapazitäten von rsyslog verlässt Daher sollte zuerst rsyslog gestartet werden. Die Skripte sind zufällige Shell-Skripte, die von ausgeführt werden #!/bin/sh
.
Um ein Programm nach dem Start im sysVinit-Stil zu starten, müssen Sie zunächst ein eigenes Skript schreiben (indem Sie es aus einem Beispiel kopieren, in das Sie /etc/init.d
hineingekommen sind), /etc/init.d
es unter einem vernünftigen Namen einfügen und einen Symlink dazu erstellen, z . B.
S99mytrojan
in /etc/rc2.d
. Hier finden Sie eine Erklärung typischer sysVinit-Skripte in /etc/init.d http://docs.oracle.com/cd/E19683-01/806-4073/6jd67r96g/index.html
Jetzt haben sich die Ubuntu-Jungs entschieden, dass sie zusätzliche Funktionen von init wollen. Sie wollten ein schnelles Booten des Betriebssystems, also wollten sie, dass ihre Skripte parallel ausgeführt werden. Sie wollten, dass tote Prozesse automatisch neu gestartet werden. Sie wollten, dass die Prozesse sich gegenseitig explizit durch Ereignisse aufrufen (so dass Apache durch das Ereignis "syslog started" und Syslog durch das Ereignis "file systems mounted" usw. ausgeführt wird, sodass wir Ereignisse anstelle einiger Zahlen 00 haben -99). So haben sie Upstart gemacht und hier ist, wie es funktioniert. Upstart-Initskripte werden in ein /etc/init
Verzeichnis gestellt (nicht verwechseln mit /etc/init.d
). Upstart läuft normalerweise/etc/init.d/rc
Da auch ausgeführt wird, werden Ihre sysVinit-Skripte normal ausgeführt. Wenn Sie jedoch möchten, dass Ihr Skript beim Beenden erneut angezeigt wird, sind Upstart-Ereignisse genau das Richtige für Sie.
Obwohl ich nicht überprüfen kann, ob mein Skript funktioniert, sollten Sie für Ihre Zwecke das folgende /etc/init/mytrojan.conf
Skript schreiben :
start on runlevel [02]
respawn
exec mytrojan --argument X
Wenn Sie jedoch Abhängigkeiten benötigen, zumindest Dateisysteme und Netzwerk, ist es möglicherweise sinnvoll, diese durch Folgendes zu ersetzen start on runlevel [02]
:
start on (local-filesystems and net-device-up IFACE!=lo)
WARNUNG: Ich habe die Richtigkeit nicht überprüft, weil ich nicht kann. Insbesondere bin ich mir nicht ganz sicher, wie ich das Skript starten soll, nachdem Ihre Netzwerkverbindung hergestellt wurde (ich habe diese Version verwendet ). Versuchen Sie, auf "Start im Netzwerk" zu googeln.