Wie führe ich mein Skript aus, nachdem SuSE den Startvorgang abgeschlossen hat?

7

Ich möchte, dass mein Server mich (über Knurren) benachrichtigt, dass der (Neu-) Startvorgang abgeschlossen ist. Ich habe die PHP-Datei, die das Knurren aussendet, bereit, aber ich weiß nicht, in welche Datei ich die Zeile einfügen soll.

Welche Datei muss ich hinzufügen, damit mein Code erst ausgeführt wird, nachdem das Booten von SuSE abgeschlossen ist?

Radek
quelle

Antworten:

5

Neuere Syntax für Suse Linux Enterprise 11 SP2 (und openSUSE?)

Der beste Weg wäre, ein Shell-Skript zu erstellen, das Ihr PHP-Skript aufruft. Dieses Shell-Skript sollte den folgenden Kommentar in der Kopfzeile haben:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          nothing
# Required-Start:    $all
# Default-Start:     3 5
# Default-Stop:      4
# Short-Description: single_line_description
# Description:       multiline_description
### END INIT INFO

Eine typische Vorlage (mit vielen erklärenden Kommentaren) finden Sie in /etc/init.d/skeleton. Diese Vorlage enthält den erforderlichen Code zum Einbinden Ihres PHP-Skripts. Sie sehen einen Startfall, in dem Sie Ihr PHP-Skript aufrufen müssten.
Ich habe eine Reihe von optionalen Parametern in der Kopfzeile verworfen, da es nicht so aussieht, als würden Sie sie benötigen.

Wichtig
Es ist wichtig, mindestens das Skelett der case-Anweisung zu verwenden (siehe Aktionen für Init-Skripte ) und mindestens den Startfall zu implementieren. Im Startfall können Sie dort Ihr Skript aufrufen.

Hier finden Sie ein kleines Skriptbeispiel, das am Ende eines Startvorgangs aufgerufen wird: siehe meine Übersicht . Ich habe eine ungültige Ausführungsstufe für den Standardstopp festgelegt, aber irgendwie wird das Skript beim Herunterfahren immer noch aufgerufen. Auf jeden Fall wird der Code im Fall "Stop" ausgeführt, nicht der im Fall "Start" beim Herunterfahren.

Wenn Sie Ihr Skript geschrieben haben, kopieren Sie es, /etc/init.dum anzunehmen, dass Ihr Init-Skript Boot-Benachrichtigung heißt. Dann würden Sie (als Root) Folgendes tun:

chown root:root boot-notification
chmod 0750 boot-notification
mv boot-notification /etc/init.d/

Dann müssen Sie das Skript im Init-System "registrieren". Sie werden den insservBefehl (wieder als root) verwenden oder YaST verwenden:

insserv boot-notification

Anschließend können Sie überprüfen, ob das Skript eines der letzten ist, das ausgeführt wird, indem Sie sich die einzelnen Init-Ebenen ansehen. Wenn Sie nur Runlevel 3 gewählt haben, können Sie dies tun:

ls -l /etc/init.d/rc3.d/S*

Dies gibt eine Liste von Links zu Init-Skripten zurück. Der Link zu Ihrem Skript sollte sich am Ende (oder in der Nähe davon) der Liste befinden.

Hinweis: Wenn Sie mit der dynamischeren Art des Schreibens von Init-Skripten herumspielen möchten, würde ich empfehlen, diese beiden Seiten zu lesen:

Huygens
quelle
Ich habe Ihre Schritte nicht zu 100% befolgt. Ich habe nur Ihre neuen Header für das Skript verwendet und jetzt kann ich die Beschreibung in yast sehen. Mein Problem ist, dass das Skript vor und nach dem Neustart ausgelöst wird. Ich möchte nicht, dass es vorher passiert.
Radek
YaST hat das Skript wahrscheinlich zum Initial für Neustart und Herunterfahren hinzugefügt. Wenn Sie das Skelett verwenden (überprüfen Sie den openSuse-Link, er enthält einen einfacheren, siehe Abschnitt 'Aktion'). Sie müssen sicher sein, dass Sie beim Aufrufen von start Ihr PHP-Skript aufrufen. Wenn stop aufgerufen wird, rufen Sie es nicht auf. Oder Sie können auch die @ Petr-Uzel-Lösung verwenden. Dann rufen Sie einfach Ihr PHP-Skript auf, ohne die Skelettstruktur anwenden zu müssen.
Huygens
Möchten Sie überprüfen, ob das Aufrufen des Skripts Teil von shutdown init ist?
Radek
1
@Radek Beim Herunterfahren oder Neustarten ändert sich der Runlevel auf (bzw.) 0 oder 6. Wenn Sie das Skript in /etc/init.d/rcn.d/K* mit n gleich 0 oder 6 haben, wird es während aufgerufen das Herunterfahren. Ich habe einen Kern (siehe Link in meiner Antwort) mit einem einfachen Skript hinzugefügt, das Sie zum Aufrufen Ihres PHP-Skripts wiederverwenden können.
Huygens
Nach der Überprüfung sind die Runlevel zum Herunterfahren und Neustarten korrekt, die Skripte werden jedoch nicht dort abgelegt. Aber in ihrem jeweiligen Start Runlevel. Wenn Sie also Runlevel 3 zum Starten des Skripts verwenden, wird in Runlevel 3 das Skript zum Herunterfahren angezeigt. Der Unterschied besteht darin, dass beim Start der Link zum Skript S <nn> <Dateiname> lautet, während es beim Herunterfahren K ist <nn> <Dateiname>
Huygens
8

(offen) SUSE verwendet /etc/init.d/after.localzu diesem Zweck. Fügen Sie einfach die Befehle, die Sie ausführen müssen, in diese Datei ein. Beachten Sie, dass dies mit SystemV init gut funktioniert, aber mit systemd müsste AFAIK anders gelöst werden.

Petr Uzel
quelle
2
Dies führt Skripte direkt nach dem ersten Maschinenstart aus, nicht nach dem Ende des Init-Startvorgangs ... AFAIK
Huygens
Ja, natürlich hast du recht, danke! Die richtige Datei lautet /etc/init.d/after.local. Aktualisiere meine Antwort.
Petr Uzel
Coole Datei, etwas, an das ich mich erinnern muss! +1
Huygens
1
Es scheint seit 12.1 nicht mehr in openSuse zu funktionieren: forums.opensuse.org/blogs/jdmcdaniel3/…, aber dieser Blog-Beitrag schlägt eine Problemumgehung vor.
Huygens
4

Für OpenSUSE 12.2 (Mantis) sollte das Skript für "after local" lauten /etc/init.d/after-local, und Sie müssen es möglicherweise über systemctl wie folgt aktivieren ...

Um /etc/init.d/after-local zu aktivieren ,

systemctl enable after-local.service

Um den Status von /etc/init.d/after-local zu überprüfen ,

systemctl status after-local.service
user34461
quelle
2

Das Hinzufügen eines neuen Init-Skripts ist in Suse ganz einfach.

Der beste Weg wäre, ein Shell-Skript zu erstellen, das Ihr PHP-Skript aufruft. Dieses Shell-Skript sollte den folgenden Kommentar in der Kopfzeile haben:

#!/bin/sh
#chkconfig: 35 99 00
#description: Notify of boot completion

Sie finden eine typische Vorlage (mit /etc/init.d/skeleton.compatvielen erklärenden Kommentaren) in (die die chkconfig-Syntax unterstützt, die auch 7etc/init.d/skeletonden neueren LSB-Standard unterstützt, aber es ist etwas komplizierter, Ihnen zu erklären, wie sie eingerichtet wird, obwohl dies der Fall ist stärker). Diese Vorlage enthält den erforderlichen Code zum Einbinden Ihres PHP-Skripts. Sie sehen einen Startfall, in dem Sie Ihr PHP-Skript aufrufen müssten.

Die wichtige Nummer, die ich dir gegeben habe, ist auf der chkconfig line.

  • 35: bedeutet, dass dieses Skript entweder in Init 3 (Konsolenmodus, üblich für Server) oder in Init 5 (Grafikmodus, häufiger für Desktop) aufgerufen wird.
  • 99: ist die Priorität in Init 3 oder 5. Dies bedeutet, dass es zuletzt aufgerufen wird. Beachten Sie, dass einige andere Boot-Skripte mit der Priorität 99 aufgerufen werden können.
  • 00: ist die Priorität für das Herunterfahren / Neustarten. Sie können auch eine Benachrichtigung erhalten, sobald das System ausfällt.

Wenn Sie Ihr Skript geschrieben haben, kopieren Sie es, /etc/init.dum anzunehmen, dass Ihr Init-Skript Boot-Benachrichtigung heißt. Dann würden Sie (als Root) Folgendes tun:

# chown root:root boot-notification
# chmod 0750 boot-notification
# mv boot-notification /etc/init.d/

Dann müssen Sie das Skript im Init-System "registrieren". Sie werden den chkconfigBefehl verwenden (wieder als root):

# chkconfig --add boot-notification

Überprüfen Sie, ob dies richtig berücksichtigt wurde:

# chkconfig boot-notification
boot-notification on

Wenn Sie weiter sehen, ist es gut!
Anschließend können Sie überprüfen, ob das Skript eines der letzten ist, das ausgeführt wird, indem Sie sich die einzelnen Init-Ebenen ansehen. Wenn Sie nur Runlevel 3 gewählt haben, können Sie dies tun:

$ ls -l /etc/init.d/rc3.d/S*

Dies gibt eine Liste von Links zu Init-Skripten zurück. Der Link zu Ihrem Skript sollte sich am Ende (oder in der Nähe davon) der Liste befinden.

Hinweis: Wenn Sie mit der dynamischeren Art des Schreibens von Init-Skripten herumspielen möchten, würde ich empfehlen, diese beiden Seiten zu lesen:

Huygens
quelle
Ich habe ein Skript erstellt, in /etc/init.d kopiert und über yast für Runlevel 3 und 5 registriert. Jetzt wird es ausgelöst, bevor der Neustart beginnt und nachdem er beendet ist. Dann habe ich den von Ihnen vorgeschlagenen Header hinzugefügt, aber er sendet vor dem Booten immer noch eine Nachricht. Irgendeine Idee, wie man das aufhält?
Radek
OK, YaST unterstützt anscheinend keine Legacy-Synax. Ich werde Ihnen dann eine weitere Antwort mit der neuesten Syntax anbieten.
Huygens
0

Ich habe festgestellt, dass es zwei Möglichkeiten gibt, dies zu tun:

  1. In erster Linie müssen Sie das Terminal öffnen und Folgendes eingeben:

sudo crontab -e

Geben Sie dann ein

@reboot sudo <command_to_execute_at_startup>

  1. Zweitens können Sie mit dieser Methode eine Servicedatei erstellen
Vektor
quelle