Skript mit rc.local ausführen: Skript funktioniert, aber nicht beim Booten
Habe ich eine node.js Skript, die brauchen, to start at boot und unter der www-data user. Während der Entwicklung habe ich immer angefangen, das Skript mit:
su www-data -c 'node /var/www/php-jobs/manager.js
Ich sah genau, was geschah, die manager.js funktioniert jetzt Super. Suche ALSO ich fand, ich hatte diesen in meinem /etc/rc.local
. Auch habe ich gelernt, zeigen Sie die Ausgabe in eine log-Datei und fügen Sie die 2>&1
"umleiten von stderr zu stdout" und es sollte ein daemon, so dass das Letzte Zeichen ist ein &
.
Schließlich, meine /etc/rc.local
sieht wie folgt aus:
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
su www-data -c 'node /var/www/php-jobs/manager.js >> /var/log/php-jobs.log 2>&1 &'
exit 0
Wenn ich diesen starte, mich (sudo /etc/rc.local
): ja, es funktioniert! Wenn ich allerdings einen Neustart durchführen, keine node
- Prozess ausgeführt wird, der /var/log/php-jobs.log
nicht vorhanden ist und somit die manager.js funktioniert nicht. Was ist passiert?
InformationsquelleAutor der Frage Jurian Sluiman | 2011-10-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
In diesem Beispiel für eine rc.lokale script, das ich verwenden, io-Umleitung bei der ersten Zeile von Ausführung zu meinem eigenen log-Datei:
InformationsquelleAutor der Antwort John Doe
Auf einigen linux - (Centos & RH z.B.),
/etc/rc.local
ist zunächst nur ein symbolischer link auf/etc/rc.d/rc.local
. Auf diesen Systemen, wenn der symbolische link ist kaputt, und/etc/rc.local
ist eine separate Datei, wechselt dann zu/etc/rc.local
erhalten nicht gesehen beim Booten -- die boot-Prozess ausgeführt wird die version in/etc/rc.d
. (Sie wird funktionieren, wenn man läuft/etc/rc.local
manuell, aber nicht ausgeführt werden, beim Booten.)Klingt wie auf dimadima-system, Sie sind separate Dateien, aber
/etc/rc.d/rc.local
Anrufe/etc/rc.local
Den symbolischen link von
/etc/rc.local
zu den 'echten'/etc/rc.d
können verloren gehen, wenn man sich bewegtrc.local
in ein backup-Verzeichnis und kopiert es zurück oder legt es von Grund auf, nicht ahnend, dass das original in/etc
war nur ein symbolischer link.InformationsquelleAutor der Antwort user3533658
Landete ich mit Emporkömmlingwelche gut funktioniert.
InformationsquelleAutor der Antwort Jurian Sluiman
In Ubuntu habe ich bemerkt, es sind 2 Dateien. Die echte ist
/etc/init.d/rc.local
; es scheint, die anderen/etc/rc.local
ist falsch?Sobald ich veränderte die richtige (
/etc/init.d/rc.local
) es Tat ausführen zu erwarten.InformationsquelleAutor der Antwort Boyan
Könnten Sie auch gemacht haben, es funktioniert, indem Sie den vollständigen Pfad angeben, auf den Knoten. Außerdem, wenn Sie möchten, führen Sie einen shell-Befehl als daemon sollten Sie schließen von stdin, durch Zugabe von 1<&- vor der &.
InformationsquelleAutor der Antwort w00t
wenn Sie mit linux auf die cloud, dann in der Regel Sie don ' T haben die chance, das Reale zu berühren-hardware mit Ihren Händen. also Sie sehen nicht die Konfigurations-Schnittstelle beim Booten für die erste Zeit, und natürlich kann es nicht konfigurieren. Als Ergebnis, die
firstboot
service wird immer in den Weg zurc.local
. Die Lösung ist das deaktivierenfirstboot
by doing:wenn Sie nicht sicher sind, warum Ihre
rc.local
nicht ausgeführt wird, können Sie immer überprüfen, aus/etc/rc.d/rc
- Datei, da diese Datei immer ausführen und rufen andere Subsysteme (z.B. rc.lokal).InformationsquelleAutor der Antwort superyuan
Ich hatte das gleiche problem (auf CentOS 7) und ich habe es behoben, indem die execute-Rechte auf /etc/local:
InformationsquelleAutor der Antwort Gayolomao
Ich habe mein Skript zu arbeiten, indem Sie Bearbeiten
/etc/rc.local
dann die Ausgabe die folgenden 3 Befehle.Nun das script funktioniert beim Booten.
InformationsquelleAutor der Antwort CatGuyTX
Ich bin mit CentOS 7.
Geben Sie den folgenden in die yourstuffs.sh script.
geben, was Sie wollen, hier auf ausführen
Speichern und Neustart des OS.
InformationsquelleAutor der Antwort lppier
Dies ist wahrscheinlich verursacht durch eine fehlende oder unvollständige PATH-Umgebungsvariable.
Wenn Sie die vollständige absolute Pfade zu ausführbaren Dateien (su und Knoten), wird es funktionieren.
InformationsquelleAutor der Antwort Asad R.
Es ist mein Verständnis, dass wenn Sie Ihr Skript in einem bestimmten RUN-Level, sollten Sie mit ln -s eine Verknüpfung der Skript, um die Ebene, die Sie wollen, dass es funktioniert.
InformationsquelleAutor der Antwort RVQ
Habe ich verwendet rc.lokale in der Vergangenheit. Aber ich habe gelernt, aus meiner Erfahrung, dass der zuverlässigste Weg, um die Ausführung des Skripts auf dem system-boot-Zeit ist, ist die Verwendung "@reboot " Befehl in der crontab. Zum Beispiel:
InformationsquelleAutor der Antwort Heapify
ersten machen das script ausführbar mit
sudo chmod 755 /path/of/the/file.sh
nun fügen Sie das Skript in der rc.lokale
sh /path/of/the/file.sh
vor exit 0
in der rc.lokale,
weiter machen die rc.lokale executable-mit
sudo chmod 755 /etc/rc.local
neben initialisieren der rc.lokale Nutzung
sudo /etc/init.d/rc.local start
dies löst die rc.lokale
jetzt starten Sie das system neu.
Getan..
InformationsquelleAutor der Antwort nikhil parashar
1 empfehlen nicht mit root laufen die apps wie Knoten-app.
Gut Sie es tun können, aber fangen kann weitere Ausnahmen.
2 Die rc.lokalen Regel ausgeführt wird, als root-Benutzer an.
Also wenn das sollte das Skript läuft als anderer user wie www-U, stellen Sie sicher, dass PFAD und eine andere Umgebung ist ok.
3 ich finde Sie eine einfache Möglichkeit, ein Dienst ausgeführt als Benutzer:
sudo -u www -ich /der/Pfad/zu/deinem/script
Bitte bevorzugen Sie die sudo-Handbuch~
-ich [Befehl]
Das -ich (simulate initial login) option runs the shell specified by die Passwort-Datenbank-Eintrag der Ziel-Benutzer als loginshell...
InformationsquelleAutor der Antwort fantaxy025025
rc.local
läuft nur noch auf Start. Wenn Sie neu starten, und möchte das Skript ausführen, es braucht, um zu gehen in dierc.0
Datei, beginnend mit der K99-Präfix.InformationsquelleAutor der Antwort Jason