Wie kann ich "rc.local" beim Start ausführen?

75

Ich habe ein Skript, das ich gerne ausführen würde, wenn mein System startet. Ich habe es auf "rc.local" gestellt, aber es funktioniert nicht. Wie kann ich die Ausführung beim Start aktivieren?

pedroo
quelle
1
Wo ist der Befehl xsetwacom? /etc/rc.local wird beim Start mit einem sehr einfachen PATH ausgeführt. Es unterscheidet sich wahrscheinlich von dem PFAD, den Sie am Terminal angemeldet haben. Geben Sie im Terminal Folgendes ein: Geben Sie -p xsetwacom ein, und ersetzen Sie dann den Befehl "xsetwacom" in /etc/rc.local durch den vollständigen Pfad, der vom Befehl "type -p" zurückgegeben wird. Müssen Sie manuelle Initialisierungen vornehmen, bevor xsetwacom für Sie funktioniert?
Waltinator
3
Wenn Sie systemd als Startup-Manager verwenden, stellen Sie sicher, dass die rc.local-Kompatibilität ausgeführt wird:systemctl status rc-local.service
rubo77
Der Kommentar des Waltinators war mein Problem. Aufgrund des minimalen Pfads wusste es nicht, wie die Skripte ausgeführt werden sollten, die ausgeführt werden sollten. Der Pfad geladen auf meinem Ubuntu 14.04 System zum Zeitpunkt der runninig /etc/rc.local war die folgende: / sbin: / usr / sbin: / bin: / usr / bin ... Sie Ihr , indem sie überprüfen könnten echo $PATH > /home/rc_local_pathin Ihre / etc / rc.local und dann die Datei überprüfen, nachdem sie beim Start ausgeführt wurde.
RaisinBranCrunch
Denken Sie daran, dass Sie Ihr Skript als Daemon in der Datei starten müssen , wenn es kontinuierlich ausgeführt werden soll! rc.local
Totymedli
Verwenden Sie sudo systemctl enable rc-local.servicediese Option, um sicherzustellen, dass /etc/rc.local sie während des Serverstarts ausgeführt wird
William,

Antworten:

56

Können Sie Ihr Skript manuell ausführen? Wenn nicht, liegt ein Problem mit diesem Skript vor. ansonsten schau mal bei rc.local nach. (Wenn dieses Skript als root ausgeführt werden muss, müssen Sie sudo verwenden, um es manuell auszuführen.)

Stellen Sie sicher, dass /etc/rc.local ausführbar ist und dass das aufgerufene Skript auch ausführbar ist.

$ ls -l /etc/rc.local
-rwxr-xr-x 1 root root 419 2010-08-27 11:26 /etc/rc.local

Stellen Sie sicher, dass rc.local eine Shebang-Zeile hat (dies ist die Standardeinstellung):

$ head -n1 /etc/rc.local
#!/bin/sh -e

quelle
Ja, ich kann das Skript manuell ausführen. Wie kann ich sicherstellen, dass /etc/rc.local ausführbar ist? Was muss ich eingeben? Ist es "$ ls -l /etc/rc.local -rwxr-xr-x 1"? Vielen Dank!
Pedroo
@pedroo: Ich habe genau das kopiert, was ich in meinem Terminal sehe (so dass Sie die Eingabeaufforderung, die Eingabe und die Ausgabe oben sehen). Der Befehl lautet "ls -l /etc/rc.local" und wenn er ausführbar ist, enthält die Ausgabe diese Xs.
3
Ich habe das "ls -l /etc/rc.local" ausprobiert und es ist ausführbar, aber ich kann es beim Start nicht zum Laufen bringen ... Irgendeine Idee?
Pedroo
1
@pedroo: Dazu muss der X-Server ausgeführt werden, was bei der Ausführung von rc.local nicht der Fall ist. Wenn Sie es von rc.local ausführen, wird es einfach beendet, ohne dass etwas unternommen wird (obwohl ich hoffe, dass es eine Nachricht in syslog oder anderswo ablegt). Sie müssen die xsetwacom-Befehle stattdessen in ~ / .xinitrc oder / etc / X / xinit / xinitrc einfügen.
1
@pedroo: Weil rc.local Befehle enthält, die zu einer anderen Zeit ausgeführt werden sollen. Erstellen Sie eine neue Datei, legen Sie sie in ~ / bin ab , markieren Sie sie als ausführbar (chmod oder Eigenschaften in Nautilus), geben Sie in der ersten Zeile "#! / Bin / bash" ein und fügen Sie Ihre Befehle in spätere Zeilen ein.
53

In meinem Fall war keine der Anweisungen eine perfekte Lösung. Wenn Sie so unglücklich waren wie ich, probieren Sie dieses ausführliche

  1. Platzieren Sie Ihren gesamten ausführbaren Code in einer separaten Textdatei mit einem beliebigen Namen wie foo.sh und speichern Sie ihn an einem beliebigen Ort.
  2. Hinzufügen

    #!/bin/sh

    als erste Zeile Ihres Codes.

  3. Versuchen Sie, Ihre Datei foo.sh by auszuführen

    sudo foo.sh

    um zu überprüfen, gibt es überhaupt keine Fehler.

  4. Geben Sie in das Skript /etc/rc.local den vollständigen Pfad und den Namen des erstellten Skripts nach dem Befehl sh ein

    sh '/path/to/your/script/foo.sh'
  5. Denken Sie daran, die obige Zeile vor die letzte Codezeile zu setzen

    exit 0

    am Ende des Skripts /etc/rc.local.

  6. Überprüfen Sie die erste Zeile von /etc/rc.local

    #!/bin/sh -e
  7. Machen Sie Ihre /etc/rc.local ausführbar, falls sie noch nicht von ausführbar ist

    sudo chown root /etc/rc.local
    sudo chmod 755 /etc/rc.local
    
  8. Überprüfen Sie, ob alles ordnungsgemäß funktioniert, indem Sie ausführen

    sudo /etc/init.d/rc.local start
  9. Testen Sie den Neustart Ihres Systems.
Shvahabi
quelle
6
Schritt 8 war der Schlüssel, mit dem sichergestellt wurde, dass das Skript in der Startumgebung ausgeführt wird. In meinem Fall muss ich den vollständigen Pfad zum Befehl angeben.
Peter Gluck
Prefect und Step-to-Step-Größen, es funktioniert auf Centos, aber sudo /etc/rc.local startzuerst ausgeführt.
A1Gard
Danke - diese Panne hat mir sehr geholfen und wie oben war Schritt 8 auch für mich der Schlüssel! Andernfalls wird +1 nicht umgeleitet (als Referenz, Node-App, die auf einem Bitnami-Cloud-Server ausgeführt wird und für die ununterbrochene Ausführung für immer verwendet wird ).
Fidev
Schritt 8 war ein guter Tipp, aber ich denke, Schritt 7 könnte das sein, was ich behoben habe. Ich habe versucht, das Skript mit cron auszuführen, um einen Tunnel zu öffnen, aber es schlug nach dem Zufallsprinzip
fehl
28

Bei neueren Ubuntu-Versionen systemdwird /etc/rc.localnicht immer standardmäßig geladen.

Überprüfen Sie, ob der Kompatibilitätsdienst mit geladen ist

systemctl status rc-local.service

Bildschirmfoto

Wenn es active (exited) enthält , scheint Ihre Einstellung in Ordnung zu sein und Sie könnten einen weiteren Fehler in Ihrer /etc/rc.localDatei haben (dies könnte beispielsweise ein Befehl sein, der fehlschlägt).

rubo77
quelle
4
wenn rc-local.service nicht aktiviert ist, lesen Sie in diesem Beitrag, der erklärt , So aktivieren Sie /etc/rc.local mit Systemd
yaitloutou
3

2 Vorschläge.

  1. Stellen Sie sicher, dass die Zielskriptdatei auch als ausführbar markiert ist.
  2. Führt das Zielskript einen sudo- Befehl aus? In diesem Fall möchten Sie möglicherweise das sudo-Kennwort angeben.

Mein Fehler. Dann schau doch mal rein. Danke für die Korrektur enzotib :)

Ankit
quelle
8
rc.localwird als root ausgeführt, daher ist kein Passwort erforderlich.
Enzotib