So führen Sie beim Start ein Shell-Skript aus

367

Auf einer Amazon S3 Linux - Instanz, ich habe zwei Skripte genannt start_my_appund stop_my_appden Start und Stopp für immer (was wiederum laufen meine Node.js - Anwendung). Ich verwende diese Skripte, um meine Node.js-Anwendung manuell zu starten und zu stoppen. So weit, ist es gut.

Mein Problem: Ich möchte es auch so einrichten, dass start_my_appes bei jedem Systemstart ausgeführt wird. Ich weiß, dass ich eine Datei hinzufügen muss init.dund weiß, wie ich sie mit dem richtigen Verzeichnis verknüpfen kann rc.d, aber ich kann nicht herausfinden, was tatsächlich in der Datei enthalten sein muss, in der ich mich befinde init.d. Ich denke, es sollte nur eine Zeile sein start_my_app, aber das hat bei mir nicht funktioniert.

Meetamit
quelle
5
Ich bin kein Experte in solchen Dingen, aber ich denke, die init.dLösung ( hier ) sollte der rc.localLösung vorgezogen werden, da die letztere das alte Werkzeug ist, das nur noch verwendbar ist, weil das neue Werkzeug abwärtskompatibel ist.
Erikbwork
pm2 starte my_app; pm2 Start; pm2 speichern github.com/Unitech/pm2
Unitech

Antworten:

292

In der Datei, die Sie eingeben /etc/init.d/, müssen Sie die ausführbare Datei festlegen mit:

chmod +x /etc/init.d/start_my_app

Dank @meetamit müssen Sie einen Symlink zu erstellen, wenn dies nicht ausgeführt wird /etc/rc.d/

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

Bitte beachten Sie, dass dies unter dem neuesten Debian nicht funktioniert, da Ihr Skript LSB-kompatibel sein muss (bieten Sie mindestens die folgenden Aktionen: Start, Stopp, Neustart, Force-Reload und Status): https: //wiki.debian .org / LSBInitScripts

Als Hinweis sollten Sie den absoluten Pfad Ihres Skripts anstelle eines relativen Pfads angeben. Dies kann unerwartete Probleme lösen:

/var/myscripts/start_my_app

Und vergessen Sie nicht, diese Datei zu ergänzen:

#!/bin/sh
Jonathan Muller
quelle
6
Ich habe das getan und es lief nicht. Wird es automatisch ausgeführt, nur weil es sich in /etc/init.d befindet, oder muss ich etwas oben tun, um die Ausführung beim Systemstart zu planen?
Amphibient
4
@amphibient Nicht ganz genug ... Sie müssen auch einen Symlink zu dieser Datei (mit lnBefehl) zu einem Verzeichnis innerhalb vonrc.d
meetamit
23
Es gibt kein rc.d-Verzeichnis im Ordner etc meines Roots. Das hat mich verblüfft. Ist dies nicht ein entscheidendes Verzeichnis, das Linux zum Starten benötigt? Es fehlt nur ein und mein Betriebssystem scheint gut zu laufen. Muss ich es erstellen? Ich sehe eine Reihe von ähnlich benannten Dateien wie "rc1.d" bis zu "rc5.d"
OKGimmeMoney
3
Ich habe keinen /etc/rc.dOrdner, aber ich habe /etc/rcX.dOrdner ( dh /etc/rc0.d , /etc/rc1.d , /etc/rcS.d ), außerdem gibt es eine Datei /etc/rc.local . Ich denke, dass Sie Symlinks in einem benutzerdefinierten Ordner wie /etc/rc9.doder in einem der vorhandenen ... (Ubuntu Server 14.04)
F8ER
2
Diese Frage half mir dabei: unix.stackexchange.com/questions/28679/…
Seth10
344

Stellen Sie hierfür eine Crontab ein

#crontab -e
@reboot  /home/user/test.sh

Nach jedem Start wird das Testskript ausgeführt.

Hemant Kumar
quelle
4
Dies ist die einzige Lösung, die für mich problemlos funktioniert hat! danke
whoopididoo
20
Dies ist die beste Lösung, @reboot sh $HOME/test.shin der Crontab ist noch sauberer
user3667089
4
@ user3667089 eigentlich funktioniert es nicht. Ich öffne das Terminal, gebe "crontab -e" ein, ein Fenster erscheint, in das ich in "@reboot sh /home/user/test.sh" schreibe, aber es läuft beim Start nicht. Wo mache ich das falsch?
MycrofD
1
@ user3667089 die üblichen Standardzeilen '# Diese Datei bearbeiten auf ...' und dann die Zeile, die ich geschrieben habe '@reboot sh /home/.../.sh'. Ich habe auch '@reboot /home/.../.sh' ohne das anfängliche "sh" versucht, aber keine Ergebnisse.
MycrofD
3
@MycrofD Sie crontab -lsollten anzeigen, um @reboot sh $HOME/test.shzu bestätigen, dass es tatsächlich eingestellt wurde.
user3667089
124

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

/PATH/TO/MY_APP &

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

su - USER_FOOBAR -c /PATH/TO/MY_APP &

(Das nachfolgende kaufmännische Und hinterlegt den Prozess und ermöglicht es dem rc.local, die Ausführung fortzusetzen.)

Wenn Sie ein vollständiges Init-Skript möchten, verfügt die Debian-Distribution über eine Vorlagendatei.

cp /etc/init.d/skeleton /etc/init.d/your_app

und passen Sie es ein wenig an.

Gilles Quenot
quelle
2
Vielen Dank! Dieser Ansatz erwies sich angesichts der einfachen Anforderungen als am besten geeignet. Ich bin mir ziemlich sicher, dass ich den Benutzer angeben musste, sonst stop_my_appmüsste ich dies tun , wenn ich die App manuell stoppen müsste (durch Ausführen ) sudo, nein? Außerdem frage ich mich, was genau die Funktion des nachfolgenden kaufmännischen Und (?) Ist.
Meetamit
3
Der Benutzer hängt von Ihrer App ab. Wenn dies jedoch nicht unbedingt als Root ausgeführt werden muss, vermeiden Sie es. &Führen Sie den Prozess im Hintergrund aus
Gilles Quenot
2
sputnick, sorry, aber ich muss Korens als akzeptierte Antwort markieren, hauptsächlich wegen dem, worauf @ erikb85 hingewiesen hat, aber auch, weil meine ursprüngliche Frage nach der init.dArt und Weise gefragt hat, wie man Dinge macht (Ihre Antwort war zu dieser Zeit nur eine einfachere Problemumgehung für mich). . Dieser Beitrag erhält viele Ansichten und Stimmen, daher ist es wichtig, genau zu bleiben.
Meetamit
4
Es scheint nicht erwähnt zu werden, dass das nachfolgende kaufmännische Und den Prozess hinterlegt und es dem rc.local ermöglicht, die Ausführung fortzusetzen.
Michigan
Danke dafür! Verbringen Sie die letzten Stunden damit, meinen Kopf gegen die Wand zu schlagen, während ich versuchte, einen Dienst zu leisten, aber nichts funktionierte. Versuchte dies, funktioniert wie ein Zauber!
Marko Grešak
35

So mache ich das auf Red Hat Linux- Systemen.

Fügen Sie Ihr Skript ein /etc/init.d, das root und der ausführbaren Datei gehört. Am Anfang des Skripts können Sie eine Anweisung für angeben chkconfig. Beispiel: Das folgende Skript wird verwendet, um eine Java-Anwendung als Benutzer Orakel zu starten.

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

#!/bin/bash
# chkconfig: 345 99 10
# Description: auto start apex listener
#
case "$1" in
 'start')
   su - oracle -c "cd /opt/apex ; java -jar apex.war > logs/apex.log 2>logs/apex_error.log &";;
 'stop')
   echo "put something to shutdown or kill the process here";;
esac

Dies bedeutet, dass das Skript auf den Ebenen 3, 4 und 5 ausgeführt werden muss und die Priorität für Start / Stopp 99 und 10 beträgt.

Als Benutzer können rootSie dann chkconfigdas Skript beim Start aktivieren oder deaktivieren:

chkconfig --list apex
chkconfig --add apex

Und du kannst verwenden service start/stop apex.

Saule
quelle
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 und sie bei einem Fehler neu zu starten.
Saule
Anstatt Folgendes einzugeben: "chkconfig --add service_name", nachdem Sie das Skript in den Ordner /etc/init.d/ gestellt haben, können Sie Folgendes eingeben: "chkconfig service_name on"
Dragan Radevic
22

Geben Sie ein cronmit sudo:

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 dann ESC und dann: x, um zu speichern und zu beenden, oder drücken Sie ESC und dann ZZ (das ist Umschalt + zz).

Test Test Test :

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

  2. Stellen Sie sicher, dass Sie Ihren Befehl in cron gespeichert haben sudo crontab -e

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

user3140639
quelle
Ich mag das sehr gerne. Vielen Dank! Ps. Nicht verwenden, sudowenn Sie beim Start einen bestimmten Befehl mit dem aktuellen Benutzer ausführen möchten.
Gefahr89
Wo sollen diese Informationen gespeichert werden? Nicht in /tmp?
Peter Mortensen
15

Lassen Sie einfach eine Zeile zu Ihrer Crontab hinzufügen.

Stellen Sie sicher, dass die Datei ausführbar ist:

chmod +x /path_to_you_file/your_file

So bearbeiten Sie die Crontab-Datei:

crontab -e

Zeile, die Sie hinzufügen müssen:

@reboot  /path_to_you_file/your_file

So einfach!

Luciano Ghilarducci
quelle
Das funktioniert bei mir nicht, fehlt mir etwas? # uname -a Linux accton-xp70a0-26-a1 3.11.10-301.fc20.x86_64 #1 SMP Thu Dec 5 14:01:17 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
Dies funktionierte für mich unter CentOs 7. Bei Problemen musste ich ein Shell-Skript erstellen, es ausführbar machen (chmod + x Dateiname) und das Shell-Skript vom Cron aus aufrufen, das wiederum den Knoten path_to_file / index.js aufruft
SeanOlson
11

Eine andere Möglichkeit besteht darin, einen @ reboot-Befehl in Ihrer crontab zu haben.

Nicht jede Version von cron unterstützt dies, aber wenn Ihre Instanz auf Amazon Linux AMI basiert, funktioniert es.

chris
quelle
6

Du kannst es schaffen :

chmod +x PATH_TO_YOUR_SCRIPT/start_my_app 

Verwenden Sie dann diesen Befehl

update-rc.d start_my_app defaults 100

Bitte beachten Sie diese Seite über Cyberciti .

IR PRO
quelle
1
Ich habe ein hübsches Barebone-Setup, das auf Yocto basiert, und dies war die einzige Möglichkeit, mein Skript-Ding zum Laufen zu bringen. Vielen Dank.
Catalin Vasile
3

Erstellen Sie Ihre eigene ausführbare / init-Datei

Das ist nicht was du willst, aber es macht Spaß!

Wählen Sie einfach eine beliebige ausführbare Datei, sogar ein Shell-Skript , und starten Sie den Kernel mit dem Befehlszeilenparameter:

init=/path/to/myinit

Gegen Ende des Startvorgangs führt der Linux-Kernel die erste ausführbare Benutzerbereichsdatei unter dem angegebenen Pfad aus.

Einige Projekte bieten beliebte initausführbare Dateien, die von großen Distributionen verwendet werden, z. B. systemd, und in den meisten Distributionen wird init eine Reihe von Prozessen abspalten, die im normalen Systembetrieb verwendet werden.

Aber wir können es entführen /init, um unsere eigenen minimalen Skripte auszuführen, um unser System besser zu verstehen.

Hier ist ein minimal reproduzierbares Setup: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/f96d4d55c9caa7c0862991025e1291c48c33e3d9/README.md#custom-init

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
2

Diese einfache Lösung funktionierte für mich auf einer Amazon Linux-Instanz, auf der CentOS ausgeführt wird. Bearbeiten Sie Ihre /etc/rc.d/rc.localDatei und geben Sie den Befehl dort ein. In dieser Datei wird erwähnt, dass sie nach allen anderen Init-Skripten ausgeführt wird. Seien Sie also in dieser Hinsicht vorsichtig. So sieht die Datei aktuell für mich aus. Geben Sie hier die Bildbeschreibung ein. Letzte Zeile ist der Name meines Skripts.

shshnk
quelle
1

Die absolut einfachste Methode, wenn Sie nur ein einfaches Skript (oder etwas anderes) ausführen möchten, ist, wenn Sie eine GUI haben, um System> Einstellungen zu verwenden, und dann Apps zu starten.

Navigieren Sie einfach zu dem gewünschten Skript und los geht's. (Skript ausführbar machen)

Feldweeper
quelle
3
Dies läuft nicht beim Start, sondern beim Anmelden, was ein ziemlich großer Unterschied ist. Dies hängt auch von einem bestimmten Setup ab, da Sie nicht auf jedem System "System> Einstellungen" haben (insbesondere nicht auf Servern).
Jazzpi
Der Suchbegriff 'Linux beim Start ausführen' führte mich zu dieser Antwort, nach der ich suchte. Auch wenn es die Frage von OP nicht beantwortet, könnte dies Linux (Ubuntu) Noobs wie mir helfen, so dass es eine positive Bewertung verdient. Ich mag es auch nicht, aber das ist Pragmatismus.
Thymaro
1

Für Debian 9 siehe /ubuntu/228304/how-do-i-run-a-script-at-start-up . Es ist mir geholfen. Kurzversion für Debian 9: Fügen Sie /etc/rc.local Befehle (als root) hinzu

/path_to_file/filename.sh ||  exit 1   # Added by me
exit 0

Wahrscheinlich sollte /path_to_file/filename.sh ausführbar sein (ich denke schon).

Mikhail Ionkin
quelle
1

In Lubuntu musste ich mich mit der umgekehrten Situation auseinandersetzen. Skype wird nach dem Booten gestartet und ich habe es in ~/.config/autostart/der Datei gefunden skypeforlinux.desktop. Der Inhalt der Datei lautet wie folgt:

[Desktop Entry]
Name=Skype for Linux
Comment=Skype Internet Telephony
Exec=/usr/bin/skypeforlinux
Icon=skypeforlinux
Terminal=false
Type=Application
StartupNotify=false
X-GNOME-Autostart-enabled=true

Das Löschen dieser Datei hat mir geholfen.

Aerijman
quelle
0
  • Fügen Sie Ihr Skript zum Verzeichnis /etc/init.d/ hinzu
  • Aktualisieren Sie Ihre RC-Run-Levels: $ update-rc.d myScript.sh defaults NNwobei NN die Reihenfolge ist, in der es ausgeführt werden soll. 99 bedeutet zum Beispiel, dass es nach 98 und vor 100 ausgeführt wird.
Kibrom Gebre
quelle
0

Arbeiten mit Python 3 Microservices oder Shell; mit Ubuntu Server 18.04 (Bionic Beaver) oder Ubuntu 19.10 (EOAN Ermine) oder Ubuntu 18.10 (Cosmic Tintenfische) ich immer , wie diese Schritte tun, und es funktionierte immer auch:

  1. Erstellen eines Microservices mit dem Namen p Beispiel "brain_microservice1.service" in meinem Fall:

    $ nano /lib/systemd/system/brain_microservice1.service
  2. In diesem neuen Service, in dem Sie sich befinden:

    [Unit]
    Description=brain_microservice_1
    After=multi-user.target
    
    [Service]
    Type=simple
    ExecStart=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices    /microservice_1.py -k start -DFOREGROUND
    ExecStop=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful-stop
    ExecReload=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful
    PrivateTmp=true
    LimitNOFILE=infinity
    KillMode=mixed
    Restart=on-failure
    RestartSec=5s
    
    [Install]
    WantedBy=multi-user.target
  3. Geben Sie die Berechtigungen:

    $ chmod -X /lib/systemd/system/brain_microservice*
    $ chmod -R 775 /lib/systemd/system/brain_microservice*
  4. Geben Sie dann die Ausführungserlaubnis:

    $ systemctl daemon-reload
  5. Aktivieren Sie dann, dies wird dann immer beim Start starten

    $ systemctl enable brain_microservice1.service
  6. Dann können Sie es testen;

    $ sudo jetzt neu starten

  7. Fertig stellen = ERFOLG !!

Dies kann mit demselben Body-Skript durchgeführt werden, um Shell auszuführen, zu reagieren ... Datenbank-Startskript ... jede Art von OS-Code ... hoffe, dies hilft Ihnen ...

...

Renan Moura
quelle
0

Hier ist eine einfachere Methode!

Erstens: Schreiben Sie ein Shell-Skript und speichern Sie es als .sh. Hier ist ein Beispiel

#!/bin/bash
Icoff='/home/akbar/keyboardONOFF/icon/Dt6hQ.png'
id=13
fconfig=".keyboard"
echo "disabled" > $fconfig
xinput float $id
notify-send -i $Icoff "Internal Keyboard disabled";

Dieses Skript deaktiviert die interne Tastatur beim Start.

Zweitens: Öffnen Sie die Anwendung "Startup Application Preferences".

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Drittens: Klicken Sie auf Hinzufügen. viertens: Geben Sie im Abschnitt NAME einen Namen an. fünftens: Navigieren Sie im Befehlsbereich zu Ihrer .sh. Sechstens: Bearbeiten Sie Ihren Befehlsabschnitt wie folgt:

bash <space> path/to/file/<filename>.sh <space> --start

Siebtens: Klicken Sie auf Hinzufügen. Das ist es! Fertig!

Bestätigen Sie jetzt, indem Sie Ihren PC neu starten.

Prost!

akbar ali
quelle
-1

Die schmerzlose, einfachste und universellste Methode besteht darin, sie einfach auszuführen ~.bash_profile oder~.profile (wenn Sie keine bash_profile-Datei haben) .

Fügen Sie einfach den Ausführungsbefehl am Ende dieser Datei hinzu und er wird ausgeführt, wenn das System gestartet wird.

Ich habe dieses unten ein Beispiel; ~\Desktop\sound_fixer.sh

Juko
quelle
2
Das ist ungenau. ~/.bash_profileWird ausgeführt, wenn sich der Benutzer anmeldet - nicht, wenn das System hochfährt. In der ursprünglichen Frage soll beim Start des Computers ein Node.js-App-Server ausgeführt werden. Für Ihre Lösung muss sich ein menschlicher Benutzer zuerst am Computer anmelden, bevor der Node.js-Server ausgeführt wird. Und wenn ein Problem dazu führt, dass ein Server über Nacht neu
gestartet
-6

Für einige Leute wird dies funktionieren:

Sie können einfach den folgenden Befehl in System hinzufügenEinstellungenStartanwendungen :

bash /full/path/to/your/script.sh
SagarSave
quelle
Ich sehe dies nicht im Systemeinstellungsmenü. Aber ich sehe es, wenn ich im Anwendungsstarter suche.
OKGimmeMoney
Dies läuft nicht beim Start, sondern beim Anmelden, was ein ziemlich großer Unterschied ist. Dies hängt auch von einem bestimmten Setup ab, da Sie nicht auf jedem System "System> Einstellungen" haben (insbesondere nicht auf Servern).
Jazzpi
3
Diese Antwort scheint eher für den Ubuntu / Linux-Desktop zu gelten, aber der Benutzer bittet tatsächlich um Hilfe für eine AWS EC2 Linux-Instanz, die meines Wissens keine grafische Benutzeroberfläche hat.
Vini.g.fer