- Official Post
In dieser Anleitung möchte ich euch zeigen wie Ihr automatisch Scripte, Programme oder einzelne Befehle startet.
Der Grund für diese Anleitung ist einfach. Im Forum und auch im IRC wurde relativ oft gefragt wie Scripte automatisch nach dem Bootvorgang ausgeführt werden.
Als erstes solltet Ihr euch fragen: Wann soll / muss mein Script ausgeführt werden?
Generell kann man Scripte jederzeit ausführen lassen. Ob es wirklich sinn macht ist eine andere Geschichte...
(Zbs. macht es keinen Sinn einen Timeserver abfragen zu wollen wenn kein Netzwerk Interface geladen wurde)
Zur Auswahl stehen 3 Optionen:
- Init-Script
- rc.local Script
- Wenn sich ein Nutzer angemeldet hat
Init-Script:
"Achtung ein wenig komplizierter!"
Unter Linux (egal welche Distribution) gibt es unter /etc/ mehrere Verzeichnis die sich rc<N>.d nennen. N steht jeweils für den jeweiligen Runlevel.
Welche Bedeutungen die Runlevels haben kann bei Wikipedia nachgelesen werden.
Nun fragt ihr euch sicherlich mit welchen Runlevel euer System momentan läuft - der Befehl runlevel liefert die passende Antwort auf eure Frage.
In meinem Fall läuft der Pi mit dem Runlevel 2 daher wird beim Booten jedes Script im /etc/rc2.d/ ausgeführt.
Ein Blick in das Verzeichnis zeigt das dort eigentlich gar keine Scripte sind sondern, nur Symbolische Links auf Scripte die sich in /etc/init.d/ befinden.
Die Namen dieser Links sind relativ leicht zu erklären:
<K|S> Kill Script - Script wird beim beenden eines Runlevels ausgeführt; Starting Script werden beim starten eines Runlevels gestartet
<0-99> Priorität - welches Script zuerst aufgerufen wird.
<Name>
Wenn wir nun ein eigenes Init-Script erstellen möchten muss es gewisse Regeln befolgen:
- Es muss einen Init Info Kommentarblock geben
- diverse Aktionen müssen ausführbar sein (start, stop, restart...)
- Script muss ausführbar sein (Rechte)
Hier ist ein Beispiel Script:
testScript.txt
Wenn das Script nun im /etc/init.d/ Verzeichnis liegt und auch die richtigen Rechte besitzt ist das schonmal die halbe Miete. Als letztes müssen wir dem System noch mitteilen das da ein neues Script existiert.
Dazu gibt es das update-rc.d Script:
Nach einem Restart wird nun euer Script ausgeführt.
Wer es ein wenig einfacher haben mag kann natürlich auch eine GUI für das einbinden benutzen zbs. rcconf (auch ohne XServer möglich)
rc.local Script
Wenn Ihr Runlevel unabhängige Scripte ausführen wollt lohnt sich ein blick in die /etc/rc.local
Datei. Dort könnt ihr an das Ende (Vor dem exit(0)) eure Scripte / Befehle einfügen.
Dieses Script wird von jedem Runlevel aufgerufen.
Bei beide Methoden (Init-Script und rc.local) werden eure Scripte unter root ausgeführt.
Wenn das ein Script unter einem bestimmten Benutzer ausgeführt werden soll dann muss es zbs. so ausgeführt werden:
ACHTUNG!
Wenn Ihr ein fehlerhaftes Script einbindet (egal ob es ein Init-Script ist oder in der rc.local) kann es euer System lahm legen!!
Deshalb sollte das Script erst per Hand getestet werden!
Wenn sich ein Nutzer angemeldet hat:
Wenn Ihr euer Script ausführen wollt nachdem sich ein Benutzer erfolgreich angemeldet hat so finden sich die passenden Scripte im Homeordner des jeweiligen Benutzers.
.bashrc
Wenn sich ein Benutzer einloggt (über Console oder ssh) dann wird die .bashrc ausgeführt (einmalig).
.profile
Wenn ein Benutzer einfach eine neue Shell startet dann wird die .profile ausgeführt (öfter).
Egal für welche Option Ihr euch entscheidet - es hängt von eurem Script / Programm ab Wo und Wann es gestartet werden soll.
Ein letzter Hinweis noch:
Wenn euer Script dauerhaft läuft und nicht einfach so beendet wird dann solltet ihr es so aufrufen
/path/script.sh&
Das & an dieser Stelle bedeute dass das Script im Hintergrund ausgeführt wird.
Wenn eurer Script dauerhaft läuft und die nicht zum ende kommt kann es vorkommen das andere (nachfolgende) Scripte nicht ausgeführt werden und damit das System blockieren!
Hinweise von meigrafd:
Die erste Umleitung " >/dev/null " schickt die Standard-Ausgabe (stdout) nach /dev/null, also dem klassischen Mülleimer von Linux
Das dahinter " 2>&1 " leitet Fehlermeldungen (stderr) auf den Kanal der Standard-Ausgabe (strout) um und landet somit ebenfalls im Mülleimer
Dadurch vermeidet man möglicherweise zu viele Logeintröge in /var/log/syslog
Trotzdem werden schwerwiegende Fehler trotzdem noch ins /var/log/syslog geschrieben und sollte auch der erste Ort sein wo ihr nachzugucken solltet wieso/weshalb/warum ein Befehl/Script über crontab nicht funktionieren will
Ausserdem solltet ihr in euren Scripts immer mit Exit-Codes arbeiten damit das System bzw crontab auch weiss ob das Script erfolgreich oder fehlerhaft ausgeführt wurde.
Wenn alles in Ordnung ist nutzt man "exit 0", das sollte immer am Ende des Scripts stehen.
Wenn es Fehler gibt zB falsche Anforderungen die fürs Durchlaufen des Scripts erfüllt sein müssten oder weil en Befehl im Script einen Fehler verursacht hat, nutzt man alles über 0 also "exit 1" oder "exit 2" usw. Mehr zu den Exit-Codes könnt ihr hier:
Display Spoiler
Ich hoffe ich konnte euch den "Autostart" ein wenig näher bringen
liebe Grüße Turael