484 Stimmen

Wie führt man ein Shell-Skript beim Start aus

Auf einer Amazon S3 Linux-Instanz habe ich zwei Skripte namens start_my_app und stop_my_app, die forever starten und beenden (was dann meine Node.js-Anwendung ausführt). Ich verwende diese Skripte, um meine Node.js-Anwendung manuell zu starten und zu stoppen. Soweit so gut.

Mein Problem: Ich möchte auch einrichten, dass start_my_app jedes Mal ausgeführt wird, wenn das System hochfährt. Ich weiß, dass ich eine Datei in init.d hinzufügen muss und ich weiß, wie ich sie in das entsprechende Verzeichnis innerhalb von rc.d verknüpfen muss, aber ich kann nicht herausfinden, was tatsächlich in die Datei kommen muss, die ich in init.d platziere. Ich denke, es sollte nur eine Zeile sein, wie z.B. start_my_app, aber das hat bei mir nicht funktioniert.

5 Stimmen

Ich bin kein Experte in dieser Art von Dingen, aber ich denke, die init.d-Lösung (hier) sollte der rc.local-Lösung vorgezogen werden, da letztere das alte Werkzeug ist, das nur noch verwendbar ist, weil das neue Werkzeug abwärtskompatibel ist.

0 Stimmen

Pm2 start my_app; pm2 startup; pm2 save github.com/Unitech/pm2 pm2 start my_app; pm2 startup; pm2 speichern github.com/Unitech/pm2

0 Stimmen

Im Raspbian gibt es eine .config/lxsession/LXDE-pi/autostart, die für mich besser funktioniert hat - gibt es ein Äquivalent in anderen Betriebssystemen? Der Grund, warum es für mich besser funktioniert hat, war, dass nicht alles (in meinem Fall Apache) initialisiert wird, wenn rc.local ausgeführt wird, während autostart der Start der Benutzersitzung ist und daher so ziemlich alles zu diesem Zeitpunkt initialisiert werden sollte.

520voto

Hemant kumar Punkte 5230

Zuerst erstellen Sie Ihr Startskript unter /home/user/startup.sh und machen es ausführbar

chmod +x /home/user/startup.sh

Legen Sie dann einen Cronjob dafür fest:

$ crontab -e
@reboot  /home/user/startup.sh

Jetzt wird Ihr startup.sh Skript bei jedem Start ausgeführt.

9 Stimmen

Dies ist die einzige Lösung, die für mich problemlos funktioniert hat! Vielen Dank

43 Stimmen

Dies ist die beste Lösung, @reboot sh $HOME/test.sh in der Crontab ist noch sauberer.

8 Stimmen

@user3667089 tatsächlich funktioniert es nicht. Ich öffne das Terminal, gebe "crontab -e" ein, ein Fenster erscheint, wo ich "@reboot sh /home/user/test.sh" eingebe, aber es wird nicht beim Start ausgeführt. Wo mache ich einen Fehler?

346voto

Jonathan Muller Punkte 7119

Die Datei, die Sie in /etc/init.d/ platziert haben, muss ausführbar gemacht werden mit:

chmod +x /etc/init.d/start_my_app

Wie @meetamit bereits erwähnt hat, könnte es sein, dass es immer noch nicht funktioniert und Sie einen symbolischen Link zur Datei in /etc/rc.d/ erstellen müssen:

ln -s /etc/init.d/start_my_app /etc/rc.d/

Bitte beachten Sie, dass dies auf den neuesten Versionen von Debian nicht funktionieren wird, da Ihr Skript LSB-konform sein muss (mindestens die folgenden Aktionen bereitstellen muss: start, stop, restart, force-reload und status): https://wiki.debian.org/LSBInitScripts

Als Hinweis: Sie sollten immer den absoluten Pfad zu Dateien in Ihren Skripten verwenden anstelle des relativen Pfads, um unerwartete Probleme zu lösen:

/var/myscripts/start_my_app

Zum Schluss, stellen Sie sicher, dass Sie den Shebang am Anfang der Datei eingefügt haben:

#!/bin/sh

10 Stimmen

Ich habe das gemacht und es hat nicht funktioniert. Wird es automatisch laufen, nur weil es in /etc/init.d ist, oder muss ich noch etwas tun, um es zu planen, damit es beim Start des Systems läuft?

6 Stimmen

@amphibient Noch nicht genug... Du musst auch einen Symlink zu dieser Datei (mit dem ln Befehl) in ein Verzeichnis innerhalb von rc.d erstellen.

2 Stimmen

Es hängt vom Distributiv ab, aber rc-update add start_my_app sollte ausreichen, um es beim Booten mit dem Parameter "start" zu starten und beim Herunterfahren mit dem Parameter "stop" zu beenden.

128voto

Gilles Quenot Punkte 153339

Ein einfacher Ansatz besteht darin, eine Zeile in /etc/rc.local hinzuzufügen:

/PFAD/ZU/MEINER_ANWENDUNG &

oder wenn Sie den Befehl als speziellen Benutzer ausführen möchten:

su - BENUTZER_FOOBAR -c /PFAD/ZU/MEINER_ANWENDUNG &

(Das nachgestellte kaufmännische Und setzt den Prozess in den Hintergrund und ermöglicht es rc.local, weiterhin ausgeführt zu werden)

Wenn Sie ein vollständiges Init-Skript möchten, haben Debian-Distributionen eine Vorlagendatei, also:

cp /etc/init.d/skeleton /etc/init.d/deine_anwendung

und passen Sie es ein wenig an.

2 Stimmen

Vielen Dank! Dieser Ansatz hat sich als am besten erwiesen, basierend auf den einfachen Anforderungen. Ich bin ziemlich sicher, dass ich den Benutzer angeben musste, da ich sonst beim manuellen Stoppen der App (durch Ausführen von stop_my_app) dies mit sudo tun müsste, oder? Außerdem frage ich mich, welche Funktion genau das nachgestellte Kaufmanns-Und-Zeichen (?) hat.

3 Stimmen

Der Benutzer hängt von Ihrer App ab. Wenn es jedoch absolut nicht erforderlich ist, als Root auszuführen, vermeiden Sie es. & Führen Sie den Prozess im Hintergrund aus.

2 Stimmen

Sputnick, tut mir leid, aber ich muss Korens als die akzeptierte Antwort markieren, hauptsächlich wegen dessen, was @erikb85 angeführt hat, aber auch weil meine ursprüngliche Frage nach der init.d Methode zum Vorgehen gefragt hat (deine Antwort war nur ein einfacherer Workaround für mich zu der Zeit). Dieser Beitrag erhält viele Ansichten und Bewertungen, daher ist es wichtig, genau zu bleiben.

39voto

Saule Punkte 539

So mache ich es auf Red Hat Linux Systemen.

Platziere dein Skript in /etc/init.d, im Besitz von root und ausführbar. Am Anfang des Skripts kannst du eine Direktive für chkconfig geben. Zum Beispiel wird das folgende Skript verwendet, um eine Java-Anwendung als Benutzer oracle zu starten.

Der Name des Skripts ist /etc/init.d/apex

#!/bin/bash
# chkconfig: 345 99 10
# Beschreibung: automatischer Start des Apex Listeners
#
case "$1" in
 'start')
   su - oracle -c "cd /opt/apex ; java -jar apex.war > logs/apex.log 2>logs/apex_error.log &";;
 'stop')
   echo "Hier etwas einfügen, um den Prozess zu beenden oder zu beenden";;
esac

Dies besagt, dass das Skript in den Ebenen 3, 4 und 5 ausgeführt werden muss und die Priorität für Start/Stop 99 und 10 ist.

Dann kannst du als Benutzer root chkconfig verwenden, um das Skript beim Start zu aktivieren oder zu deaktivieren:

chkconfig --list apex
chkconfig --add apex

Und du kannst service start/stop apex verwenden.

0 Stimmen

In der Zwischenzeit habe ich mit einem Paket namens supervisord experimentiert (supervisord.org), das im epel-Repository verfügbar ist. Es kann verwendet werden, um Programme zu starten und zu überwachen, sie bei einem Ausfall neu zu starten.

0 Stimmen

Statt "chkconfig --add service_name" einzugeben, nachdem das Skript in den Ordner /etc/init.d/ verschoben wurde, kann man "chkconfig service_name on" eingeben.

36voto

user3140639 Punkte 509

Geben Sie cron mit sudo ein:

sudo crontab -e

Fügen Sie einen Befehl hinzu, der beim Start ausgeführt werden soll, in diesem Fall ein Skript:

@reboot sh /home/user/test.sh

Speichern:

Drücken Sie ESC und dann :x zum Speichern und Beenden, oder drücken Sie ESC und dann ZZ (das ist Shift + zz)

Test Test Test:

  1. Führen Sie Ihr Testskript ohne cron aus, um sicherzustellen, dass es tatsächlich funktioniert.

  2. Vergewissern Sie sich, dass Sie Ihren Befehl in cron gespeichert haben, verwenden Sie sudo crontab -e

  3. Starten Sie den Server neu, um zu bestätigen, dass alles funktioniert sudo @reboot

1 Stimmen

Ich mag das sehr gerne. Danke! Ps. Verwenden Sie sudo nicht, wenn Sie einen bestimmten Befehl beim Start mit dem aktuellen Benutzer ausführen möchten.

0 Stimmen

Wo soll diese Information gespeichert werden? Nicht in /tmp??

1 Stimmen

Laut Wikipedia wird @reboot nicht weit verbreitet unterstützt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X