Ich benutze Ubuntu 12.04 und möchte einen Dienst starten, wenn das System normal gebootet wird.
Als 'Dienst' verstehe ich einen Code, zum Beispiel cd mein_Verzeichnis; my_command -host 0.0.0.0 -port 1234 -arg x, das so ausgeführt werden sollte, als ob es in der Befehlszeile gestartet worden wäre. Es gibt Dienste, die als normaler Benutzer gestartet werden müssen, aber auch Dienste, die als Root gestartet werden müssen (tatsächlich müssen die Dienste nicht auf Benutzerebene ausgeführt werden).
Ich muss auch das Verhalten konfigurieren, wenn ein "Dienst" beendet wird. Ich möchte, dass sie in meinem Fall mit demselben Argument in einem angegebenen Verzeichnis neu gestartet werden.
Alle Dienste sollten automatisch gestartet werden, wenn das System normal gestartet wird, dh wenn der Netzschalter gedrückt wird. Es sollte keine weitere Aktion erforderlich sein.
Es gibt einige Dokumente, die im Internet verbreitet sind, aber alle verwirren mich. Sie sprechen über init
, init.d
, rc.d
, aber ich sah nie eine einfach zu folgen Schritt- für -Schritt - Anleitung , um leicht als Service mit zB Emporkömmling. Wenn dies einfach ist, würde ich mich freuen, wenn diese Schritte hier angegeben werden.
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 sindTraditionell 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
:Dies bedeutet, dass beim Umschalten auf Runlevel 2 init process zuerst
network-manager
Prozesse beendet werden, da sein Skriptname mitK
-K02network-manager
und dann Prozesse startet, deren Namen mit beginnenS
. Die zwei Ziffern nachS
oderK
sind die Zahlen von 00 bis 99, die die Reihenfolge bestimmen, in der die Prozesse gestartet werden. ZBrsyslog
wird sie vorher gestartetapache2
, 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.htmlJetzt 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 :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]
: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.
quelle