Wie kann ich ein Skript in /etc/init.d beim Booten starten lassen?

83

Ich glaube, ich habe vor einiger Zeit etwas darüber gelesen, aber ich kann mich nicht erinnern, wie es gemacht wurde. Grundsätzlich habe ich einen Dienst, bei /etc/init.ddem ich beim Booten automatisch starten möchte. Ich erinnere mich, dass es etwas mit dem Verknüpfen des Skripts mit dem /etc/rc.dVerzeichnis zu tun hat , aber ich kann mich derzeit nicht erinnern. Was ist der Befehl dafür?

Ich glaube, ich bin auf einem Fedora / CentOS-Derivat.

Naftuli Kay
quelle
Das hängt von Ihrem Betriebssystem ab. Welche Unix-Variante laufen Sie, und wenn Linux, welche Distribution? Welche unter /etc/init, /etc/init.d, /etc/rc.d, /etc/rc.localund ein paar mehr hat es?
Gilles
1
Ich denke, ich bin auf CentOS oder so ähnlich. Würde sich die Antwort für Debian unterscheiden? Ich bin auch an einer Lösung für Debian interessiert.
Naftuli Kay

Antworten:

109

Wenn Sie, wie bereits erwähnt, auf einem Red Hat-basierten System arbeiten, haben Sie folgende Möglichkeiten:

  1. Erstellen Sie ein Skript und platzieren Sie es in /etc/init.d(zB /etc/init.d/myscript). Das Skript sollte das folgende Format haben:
#!/bin/bash
# chkconfig: 2345 20 80
# description: Description comes here....

# Source function library.
. /etc/init.d/functions

start() {
    # code to start app comes here 
    # example: daemon program_name &
}

stop() {
    # code to stop app comes here 
    # example: killproc program_name
}

case "$1" in 
    start)
       start
       ;;
    stop)
       stop
       ;;
    restart)
       stop
       start
       ;;
    status)
       # code to check status of app comes here 
       # example: status program_name
       ;;
    *)
       echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0 

Das Format ist ziemlich normal und Sie können vorhandene Skripte in anzeigen /etc/init.d. Sie können dann das Skript wie folgt verwenden /etc/init.d/myscript startoder chkconfig myscript start. Die ckconfigManpage erklärt den Header des Skripts:

 > This says that the script should be started in levels 2,  3,  4, and
 > 5, that its start priority should be 20, and that its stop priority
 > should be 80.

Der beispielhafte Start-, Stopp- und Statuscode verwendet die in definierten Hilfsfunktionen /etc/init.d/functions

  1. Aktivieren Sie das Skript

    $ chkconfig --add myscript 
    $ chkconfig --level 2345 myscript on 
    
  2. Stellen Sie sicher, dass das Skript aktiviert ist - für die von Ihnen ausgewählten Ebenen sollte "Ein" angezeigt werden.

    $ chkconfig --list | grep myscript
    
canen
quelle
3
Chkconfig ist was du willst. +1
whoami
Warum hat init etwas auf Runlevel 2, 3, 4 und 5 gestartet? Müssen Sie nicht darauf achten, einen Server auf Runlevel 2 nicht zu starten? Und Runlevel 4 ist auf RHEL sowieso nicht definiert. Warum sollte man es also auf diesem Runlevel starten? Keine Kritik, nur wissen wollen. Ich bin ein gebürtiger Slackware-Benutzer.
Bruce Ediger
4 ist auf RHEL nicht definiert, existiert aber. Sie können es für Ihre eigenen Sachen stehlen.
Kevin M
Der Header stammt aus der Manpage chkconfig. Ich persönlich halte mich in den meisten Fällen an 235 oder nur an 35.
Canen
Gibt es ein Protokoll, das ich einsehen kann, wenn während des Startvorgangs etwas nicht startet?
Utkarsh Sinha
10

Sie testen, in welchen Runlevel Ihre Maschine normalerweise startet.

runlevel

Oft ist dies 5 oder 2 - es gibt verschiedene Konventionen, aber nichts wirklich Etabliertes, afaik. Ubuntu verwendet 2, während die frühere Distribution, die ich verwendet habe, immer verwendet wurde

  • 1 Single User (Super User)
  • 2 Mehrbenutzer
  • 3 Mehrbenutzer + Netzwerk
  • 4 nicht verwendet / benutzerdefinierbar
  • 5 Mehrbenutzer, Netzwerk + X11

Dann machst du einen Symlink von deinem Init-Skript, vielleicht /etc/init.d/foobarzu/etc/rc2.d/SXYfoobar

S bedeutet 'Starte dieses Skript in diesem Runlevel (hier: 2). XY ist eine zweistellige Dezimalzahl, die für die Reihenfolge relevant ist, in der die Skripte gestartet werden.

Wenn Sie sich darauf verlassen müssen, dass das Skript S45barfoo vor Ihnen ausgeführt wird, und S55foofoo von Ihrem Skript abhängt, wählen Sie xy zwischen 45 und 55. Bei gleichen Zahlen ist die Startreihenfolge undefiniert.

Ubuntu hat mittlerweile auf eine andere Startprozedur umgeschaltet, genannt upstart.

Und beachten Sie: Nicht immer verlinken die Links auf /etc/rcX.d- manchmal ist es /etc/init/rcX.doder ähnliches, aber es sollte leicht zu finden sein, irgendwo unter / etc.

Wenn Sie etwas am Ende des Startskripts starten möchten, müssen Sie nach /etc/rc.localeiner Datei suchen. Wenn dies jedoch davon abhängt, dass X11 bereits ausgeführt wird, suchen Sie möglicherweise nach einer Autostart-Option für Ihre Desktop-Umgebung oder /etc/X11/Xsession.d/nach einem ähnlichen Muster wie beschrieben über.

Wenn Sie davon abhängig sind, dass das Netzwerk aktiv ist, gibt es ein separates Verzeichnis (if-up.d) und für gemountete Geräte wie externe USB-Laufwerke /etc/udev/rules.d/.

Benutzer unbekannt
quelle
Gibt es nicht einen Befehl, der die Verknüpfung für Sie ausführt? Ich dachte, ich erinnere mich an so etwas.
Naftuli Kay
1
War es nicht update-rc.d?
Naftuli Kay
GUI oder Kommandozeile? Ihr DE bietet möglicherweise ein Tool zum Markieren der Runlevel, mit denen Sie Ihr Skript starten oder stoppen können. Ich habe so etwas gesehen, erinnere mich aber nicht an einen Namen und wie man die Zahl angibt (xy).
Benutzer unbekannt
Befehlszeile. Es übernimmt die Verknüpfung für Sie und ermöglicht es Ihnen, Schalter zu betätigen, ob bestimmte Skripte ausgeführt werden oder nicht.
Naftuli Kay
3

Als Naftuli Tzvi Kay oben nach Debian fragte: Ab Debian 6 sollte Ihr Skript einen LSB-Header (Linux Standards Base) enthalten, der seine Abhängigkeiten und Fähigkeiten anzeigt ( siehe Debian-Wiki-Seite ).

Wenn ein LSB-Header vorhanden ist, können Sie insservIhr Skript in den Boot-Vorgang einbeziehen ( siehe eine andere Debian-Wiki-Seite ).

mdt
quelle