So starten Sie eine Anwendung automatisch beim Booten

26

Ich bin neu in Linux und freue mich darauf, die Anwendung zu starten (die alle 10 Sekunden eine LED wechselt). Ich habe das Anwendungsprogramm geschrieben und es funktioniert einwandfrei, aber jetzt möchte ich es automatisch beim Booten starten.

In der Dokumentation wird angegeben , dass das Startskript in das /etc/init.dVerzeichnis kopiert und eine symbolische Verknüpfung zu dem kopierten Skript im rc.dVerzeichnis hergestellt werden soll.

Wie sollten die Erweiterung und der Name dieser Skriptdateien lauten? Können wir den symbolischen Link manuell hinzufügen rc.doder gibt es eine spezielle Vorgehensweise dafür?

Irgendein Vorschlag, wie man es erreicht?

Schlucht
quelle
Die bevorzugte Methode zum Hinzufügen eines Init-Skripts zum Start ist von Distribution zu Distribution unterschiedlich. Einige lehnen sie sogar zugunsten von Emporkömmlingen und systemd ab. Ich würde nicht empfehlen, einfach "&" für den Hintergrund zu verwenden, da so etwas wie Debian start-stop-daemones besser handhabt (obwohl es vorzuziehen ist, dass das Programm selbst dämonisiert). Welche Distribution benutzt du? Außerhalb von Desktop-MIME-Typen sind Dateierweiterungen in * nix bedeutungslos und es wird bevorzugt, dass ausführbare Dateien keine haben.
Jordanien
Wenn Sie petalogix verwenden, befolgen Sie einfach diese Dokumentation - keine speziellen Namen erforderlich, tun Sie einfach, was sie sagen. Hast Du es versucht? Welche Probleme haben Sie? (Wenn nicht, geben Sie bitte Ihre Distribution an und erklären Sie, was mit dem, was Sie versucht haben, nicht funktioniert.)
Mat
Ich benutze Debian "wheezy" für RPi.
Schlucht
1
Wenn Sie dies ungefähr alle 10 Sekunden tun müssen (dh nicht alle 10 Sekunden scharf), können Sie cronstattdessen verwenden.
Peterph
@peterph: aber es hört sich so an, als würde das Programm alle 10 Sekunden die LED umschalten, nicht ein Programm, das alle 10 Sekunden ausgeführt wird.
Zorawar

Antworten:

19

Hier ist der Auszug aus http://www.debian-administration.org/articles/28, der Ihre Frage zu beantworten scheint.

Hinweis: Im folgenden Beispielskript fügen Sie einfach einen Aufruf zum start)Abschnitt " " hinzu, um Ihr Programm tatsächlich zu starten. Sie können die Funktionalität des Skripts testen, ohne das System neu zu starten: Rufen Sie es mit dem vollständigen Pfad auf und geben Sie den Parameter "start " oder " stop".

Hier geht:

Debian verwendet ein Sys-V-ähnliches Init-System, um Befehle auszuführen, wenn sich der Runlevel des Systems ändert - zum Beispiel beim Booten und Herunterfahren.

Wenn Sie einen neuen Dienst hinzufügen möchten, der beim Starten des Computers gestartet wird, müssen Sie das erforderliche Skript zum Verzeichnis hinzufügen /etc/init.d/ . Viele der Skripte, die bereits in diesem Verzeichnis vorhanden sind, geben Ihnen ein Beispiel für die Art der Dinge, die Sie tun können.

Hier ist ein sehr einfaches Skript, das in zwei Teile unterteilt ist: Code, der immer ausgeführt wird, und Code, der ausgeführt wird, wenn er mit "start" oder "stop" aufgerufen wird.

#! /bin/sh
# /etc/init.d/blah
#

# Some things that run always
touch /var/lock/blah

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting script blah "
    echo "Could do more here"
    ;;
  stop)
    echo "Stopping script blah"
    echo "Could do more here"
    ;;
  *)
    echo "Usage: /etc/init.d/blah {start|stop}"
    exit 1
    ;;
esac

exit 0

Sobald Sie Ihre Datei am richtigen Ort gespeichert haben, stellen Sie sicher, dass sie ausführbar ist, indem Sie "chmod 755 /etc/init.d/blah " .

Anschließend müssen Sie die entsprechenden symbolischen Links hinzufügen, damit das Skript ausgeführt wird, wenn das System ausfällt oder hochfährt.

Am einfachsten geht das mit dem Debian-spezifischen Befehl update-rc.d:

root@skx:~# update-rc.d blah defaults
 Adding system startup for /etc/init.d/blah ...
   /etc/rc0.d/K20blah -> ../init.d/blah
   /etc/rc1.d/K20blah -> ../init.d/blah
   /etc/rc6.d/K20blah -> ../init.d/blah
   /etc/rc2.d/S20blah -> ../init.d/blah
   /etc/rc3.d/S20blah -> ../init.d/blah
   /etc/rc4.d/S20blah -> ../init.d/blah
   /etc/rc5.d/S20blah -> ../init.d/blah
Alexander Shcheblikin
quelle
Muss ich dieses Skript tatsächlich in etc / init.d / platzieren oder gibt die oberste Zeile # /etc/init.d/blah einen Ort für die Shell an?
user137717
Ich erhalte "-sh: update-rc.d: Befehl nicht gefunden"
m4l490n
2
Neuere Systeme verwenden systemdviele Funktionen, einschließlich der Startkonfiguration. Verwenden Sie systemctlzu steuern und konfigurieren systemd.
Alexander Shcheblikin
4

Am besten überprüfen Sie die Paketquelle Ihrer Distribution auf einen regelmäßigen Systemdienst, z. B. für OpenSSH - Sie werden sehen, was die bewährten Methoden sind. Schließlich liegt einer der Gründe für Open Source darin, aus den Quellen lernen zu können.

peterph
quelle
2
Exzellente Beratung! Wirklich weise und relevant und abgestimmt auf alle Distos. (Und im Übrigen beantwortet das "Neu bei Linux" und das "Wie mache ich das
?
3

Verwenden Sie Supervisor, ein effektives Programm, das die Startanwendungen mit Argumenten verwaltet und protokolliert. Weitere Informationen finden Sie unter http://supervisord.org/running.html und (Folgen Sie den Installationsanweisungen.

Erstellen Sie eine Conf-Datei unter /etc/supervisor/conf.d/{PROGRAM_NAME}.confund hier ist der Code,

[program:{PROGRAM_NAME}]
command=/usr/bin/{PROGRAM_NAME} -arg1 -arg2
autostart=true  
autorestart=true  
stderr_logfile=/var/log/supervisor/{PROGRAM_NAME}.err.log  
stdout_logfile=/var/log/supervisor/{PROGRAM_NAME}.out.log  

Führen Sie dann von der cmd-Zeile aus:

supervisorctl reload

Cosmo Arun
quelle
Obwohl Ihre Antwort in Ordnung ist, sollten Sie sie meines
Erachtens
3

Die Benutzung crontabist viel einfacher.

Verwenden Sie crontab -ediese Option, um die Crontab des Benutzers zu bearbeiten.
Fügen Sie am Ende folgende Zeile hinzu:

@reboot <command>

Beispiele:

  • @reboot my_script.sh
  • @reboot python my_script.py arg1 arg2

Stellen Sie abschließend crontab -lmit sicher, dass Ihr Skript zur Liste hinzugefügt wurde.

Jithin Pavithran
quelle
Ich frage mich, warum diese Antwort Abwertungen erhalten hat? Scheint eine sehr einfache Lösung zu sein, die Crontab verwendet - was wahrscheinlich jeder bereits kennt und versteht.
Kolinko
1

Neuere Versionen der Linux- Unterstützung systemd (wie @AlexanderShcheblikin sagte). Es hat mehr Funktionen und ist portabler als eine debian-spezifische Lösung.

Bitte lesen Sie diese wirklich gute Anleitung .

Hier ist eine kurze Referenz des Nötigste benötigt:

  1. Ein Skript (zB myscript.sh) mit ausführbaren Berechtigungen.
  2. Eine Unit-Datei (z. B. myservice.service) mit der Erweiterung ".service" /etc/systemd/systemmit 644-Berechtigungen, die den Befehl zum Ausführen des Skripts enthält. Beispielsweise,

:

[Unit]
Description=Example systemd service.

[Service]
Type=simple
ExecStart=/bin/bash /path/to/myscript.sh

[Install]
WantedBy=multi-user.target
  1. Führen Sie den Befehl aus sudo systemctl enable myservice, um ihn beim Booten zu starten.
Mareoraft
quelle