484 Stimmen

Wie man ein Shell-Skript beim Start ausführt

Auf einer Amazon S3 Linux-Instanz habe ich zwei Skripte namens start_my_app und stop_my_app, die forever starten und stoppen (was wiederum 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 richtige Verzeichnis in rc.d verknüpfen muss, aber ich kann nicht herausfinden, was tatsächlich in die Datei gehen 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 bevorzugt werden, weil letztere das alte Tool ist, das nur noch verwendbar ist, weil das neue Tool abwärtskompatibel ist.

0 Stimmen

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

0 Stimmen

In Raspbian gibt es eine .config/lxsession/LXDE-pi/autostart, die für mich besser funktioniert hat - gibt es dies 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 Beginn der Benutzersitzung ist, so dass zu diesem Zeitpunkt so ziemlich alles initialisiert sein sollte.

520voto

Hemant kumar Punkte 5230

Zuerst erstellen Sie Ihr Startskript @ /home/user/startup.sh und stellen 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

Das ist die einzige Lösung, die für mich ohne Probleme funktioniert hat! Danke dir

43 Stimmen

Dies ist die beste Lösung, @reboot sh $HOME/test.sh im Cronjob ist sogar noch sauberer.

8 Stimmen

@user3667089 tatsächlich funktioniert es nicht. Ich öffne das Terminal, gebe "crontab -e" ein, ein Fenster erscheint, in dem ich "@reboot sh /home/user/test.sh" schreibe, 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 mit folgendem Befehl ausführbar gemacht werden:

chmod +x /etc/init.d/start_my_app

Wie von @meetamit angemerkt, falls es immer noch nicht läuft, müssen Sie möglicherweise einen symbolischen Link zur Datei in /etc/rc.d/ erstellen

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, Neustart, Force-Neuladen und Status): https://wiki.debian.org/LSBInitScripts

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

/var/myscripts/start_my_app

Stellen Sie außerdem sicher, dass Sie den Shebang oben in der Datei eingefügt haben:

#!/bin/sh

10 Stimmen

I did this and it didn't run. will it run automatically just because it is in /etc/init.d or do i need to do something on top to schedule it to run when the system starts? ich habe das gemacht und es hat nicht funktioniert. Wird es automatisch laufen, nur weil es in /etc/init.d ist, oder muss ich etwas zusätzliches tun, um es zu planen, damit es läuft, wenn das System startet?

6 Stimmen

@amphibient Noch nicht ganz genug... Sie müssen auch einen symbolischen Link zu dieser Datei erstellen (mit dem ln Befehl) zu einem Verzeichnis innerhalb von rc.d

2 Stimmen

Es hängt von der Distribution 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 ist, eine Zeile in /etc/rc.local hinzuzufügen:

/PFAD/ZU/MEINER_APP &

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

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

(Das nachgestellte Kaufmanns-Und stellt den Prozess in den Hintergrund und ermöglicht es rc.local, mit der Ausführung fortzufahren)

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

cp /etc/init.d/skeleton /etc/init.d/deine_app

und passen Sie es etwas an.

2 Stimmen

Danke! Dieser Ansatz hat sich als am besten geeignet erwiesen, angesichts der einfachen Anforderungen. Ich bin ziemlich sicher, dass ich den Benutzer angeben musste, auch wenn ich die App manuell stoppen musste (indem ich stop_my_app ausführen), müsste ich dies dann mit sudo tun, oder? Außerdem frage ich mich, was genau die Funktion des nachgestellten Ampersands (?) ist.

3 Stimmen

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

2 Stimmen

Sputnick, entschuldige, aber ich muss Korens Antwort als die akzeptierte markieren, hauptsächlich wegen dem, was @erikb85 angemerkt hat, aber auch weil meine ursprüngliche Frage nach der init.d-Methode 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

Dies ist die Art und Weise, wie ich es auf Red Hat Linux Systemen mache.

Setzen Sie Ihr Skript in /etc/init.d, im Besitz von root und ausführbar. Am Anfang des Skripts können Sie eine Anweisung 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: Startet den Apex-Listener automatisch
#
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 zum Herunterfahren oder Beenden des Prozesses einfügen";;
esac

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

Dann können Sie als Benutzer root chkconfig verwenden, um das Skript beim Start zu aktivieren oder zu deaktivieren:

chkconfig --list apex
chkconfig --add apex

Und Sie können service start/stop apex verwenden.

0 Stimmen

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

0 Stimmen

Statt "chkconfig --add service_name" einzugeben, nachdem das Skript in den Ordner /etc/init.d/ verschoben wurde, kannst du "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, um zu speichern und zu verlassen, 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. Danke! Ps. Verwenden Sie nicht sudo, wenn Sie einen bestimmten Befehl mit dem aktuellen Benutzer während des Startvorgangs 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