Warum wird der Befehl in /etc/rc.local beim Start nicht ausgeführt?

39

Ich habe einen einzelnen Befehl in meinem /etc/rc.localSkript, der den Update-Daemon für Tiny Tiny RSS während des Starts starten soll , aber das Skript wird während des Starts nicht ausgeführt. Warum?

Die gesamte Datei /etc/rc.local:

#!/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.

/sbin/start-stop-daemon -b -c www-data:www-data -S -x /usr/bin/php /var/www/ttrss/update_daemon2.php -- -quiet

exit 0

/etc/rc.local ist ausführbar:

# ls -l /etc/rc.local
-rwxr-xr-x 1 root root 342 May 25 16:14 /etc/rc.local

/etc/init.d/rc.local existiert und ist ausführbar:

# ls -l /etc/init.d/rc.local
-rwxr-xr-x 1 root root 801 Jul 27  2012 /etc/init.d/rc.local

/etc/init.d/rc.local soll beim Start für dieses Runlevel ausgeführt werden:

# runlevel 
N 2
# ls -l /etc/rc2.d/S99rc.local 
lrwxrwxrwx 1 root root 18 Sep 22  2012 /etc/rc2.d/S99rc.local -> ../init.d/rc.local

Wenn ich manuell /etc/rc.local von der Kommandozeile aus aufrufe, wird der update_daemon geladen ...

# /etc/rc.local
# ps ax | grep update_daemon2.php
2233 ?        S      0:00 /usr/bin/php /media/sda5/www/news/update_daemon2.php -quiet
2234 ?        S      0:00 /usr/bin/php /media/sda5/www/news/update_daemon2.php -quiet

... was ich bei jedem Neustart meines Servers tun muss, bis dieses Problem behoben ist.

Ähnliche Fragen gibt es bereits , aber bisher konnte ich die Informationen nicht auf mein spezifisches Problem anwenden.

Warum wird der Befehl in rc.local beim Start nicht ausgeführt?

xx
quelle
Kann an der requirettyEinstellung liegen. Wenn Sie angemeldet sind, führen Sie das Skript in TTY aus, aber während des Systemstarts nicht in TTY. Dieser Link kann Ihnen helfen, shell-tips.com/2014/09/08/… Danke.
KICT

Antworten:

23

rc.localDas Skript wird beendet, wenn beim Ausführen eines Befehls ein Fehler auftritt (erwähnen Sie das -eFlag in #!/bin/sh -e).

Es ist möglich, dass einige Voraussetzungen nicht erfüllt sind, wenn Sie versuchen, Ihre Befehle auszuführen, während die rc.localAusführung stattfindet, sodass Ihre Befehlsausführung fehlschlägt.

Ich bin auf dasselbe gestoßen, als ich den CPU-Gouverneur manuell eingestellt habe und dies nicht getan habe rc.local. Hier ist meine benutzerdefinierte Problemumgehung, mit der update-rc.dIhre Befehle beim Start ausgeführt werden:

  1. Erstellen Sie eine Datei myscript.shin einem Verzeichnis /etc/init.dmit einer Überschrift:#!/bin/sh
  2. Geben Sie Ihre benutzerdefinierten Befehle als Inhalt ein
  3. Mach es ausführbar: sudo chmod +x /etc/init.d/myscript.sh
  4. Erstellen Sie Symlinks für Ihr Skript für verschiedene Runlevel: sudo update-rc.d myscript.sh defaults

Sie können auch /etc/network/if-up.dSkripte überprüfen und feststellen, ob Sie Ihre Befehle beim Start des Netzwerks auslösen können.

Drew
quelle
Danke für die Antwort. Mein Setup hat sich geändert, seitdem ich die Frage gestellt habe. Daher kann ich nicht testen, ob Ihre Antwort das Problem gelöst hätte.
xx
Bitte sagen Sie mir, was macht der Schritt-4? Ich bin neu inupdate-rc.d
Mohith7548
7

Ich hatte ein ähnliches Problem in rc.local nicht beim Start ausgeführt

sshades gab mir folgende Antwort:

Ubuntu verwendet jetzt systemd und rc.local wird jetzt als Dienst angesehen, der standardmäßig deaktiviert ist. Sie können rc.local aktivieren, indem Sie den folgenden Befehl eingeben und neu starten:

sudo systemctl enable rc-local.service

https://askubuntu.com/a/770033/395498

Obwohl ich seine Lösung nicht getestet habe, denke ich, dass es logisch klingt und funktionieren wird. Jedoch :

Ich habe auch eine Lösung gefunden, mit der ein Skript zu ./.config/autostart-scripts/ hinzugefügt werden kann

Diet Bos
quelle
7
Diesen Fehler bekommen. Die Einheitendateien haben keine Installationskonfiguration (WantedBy, RequiredBy, Also, Alias-Einstellungen im Abschnitt [Install] und DefaultInstance für Vorlageneinheiten). Dies bedeutet, dass sie nicht mit systemctl aktiviert werden sollen. Mögliche Gründe für diese Art von Einheiten sind: 1) Eine Einheit kann statisch aktiviert werden, indem eine Verknüpfung mit dem Verzeichnis .wants / oder .requires / einer anderen Einheit hergestellt wird. 2) Der Zweck einer Einheit kann sein, als Helfer für eine andere Einheit zu fungieren, die eine Anforderungsabhängigkeit davon hat.
Rıfat Erdem Sahin
Ich erhalte auch diesen Fehler. Wenn rc.localdeaktiviert ist, was ist die Alternative?
Ben,
5

Probieren sudo sysv-rc-confSie aus, ob rc.localaktiviert ist

rc.local         [ ]   [x]   [x]   [x]   [x]   [ ]   [ ]   [ ]
zuba
quelle
Ja, es ist aktiviert.
xx
Muss dieser Befehl installiert werden?
jcollum
1
@jcollum ja, es ist ein Programm aus einem gleichnamigen Paket. sudo apt install sysv-rc-conf
Geben Sie
rc.localist nicht einmal in meiner Liste der Dienstleistungen!
Ben,
5

Stellen Sie sicher, dass das Skript rc.local ausführbar ist:

sudo chmod +x /etc/rc.local

Aktivieren Sie es dann:

sudo systemctl enable rc-local.service

Starten Sie das System neu oder starten Sie das Skript manuell, indem Sie Folgendes ausführen:

sudo systemctl start  rc-local.service

Der Dienststatus kann angezeigt werden, indem Sie Folgendes ausführen:

$ sudo systemctl status rc-local.service
 rc-local.service - /etc/rc.local Compatibility
   Loaded: loaded (/lib/systemd/system/rc-local.service; static; vendor preset: enabled) 
Drop-In: /lib/systemd/system/rc-local.service.d
           └─debian.conf
   Active: active (running) since Mon 2018-04-02 10:39:44 -03; 1s ago
  Process: 2044 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)
 Main PID: 2049 (svscanboot)
Tasks: 3
 Memory: 556.0K
CPU: 10ms
CGroup: /system.slice/rc-local.service
leobocao
quelle
Sie müssen den Dienst nicht manuell aktivieren. Wenn die Datei vorhanden und ausführbar ist, aktiviert systemd den rc-localDienst automatisch .
muru
4

Wir hatten dieses Problem auf einigen gehosteten Servern, die FW-Regeln laden.

Auf diesen Boxen werden sie SEHR schnell neu gestartet und wir haben gerade festgestellt, dass in rc.local eine "sleep 1" eingefügt wurde, bevor die load-Anweisungen das Problem zu beheben scheinen. Ich denke, es gab ein wenig Zeit, bis sich die Schnittstellen eingerichtet hatten, bevor die FW-Regeln geladen wurden.

Simon Hart
quelle
1
Danke. sleep 1mein problem gelöst. Interessant Ich habe viele Server, aber nur einer hat dieses Problem.
Qian Chen
1

Ich habe einmal rc.localmit Notepad in Windows bearbeitet und es begann dieses Problem zu haben.

In diesem Fall unterstützt die Verwendung eines Texteditors die EOL-Konvertierung, z. B. Notepad ++, um den EOL-Stil in "Unix" zu konvertieren.

Sie können dies auch :set ff=unixin Vim tun .

SyaSyaNown
quelle
1

Ich habe in Ubuntu lxc Containern festgestellt, dass wenn rc.local einen vollkommen korrekten shebang hat zB

#!/bin/sh

es schlägt fehl, aber wenn Sie den shebang entfernen, funktioniert es.

Ich bin nicht auf den Grund gekommen, warum oder welche Shell es verwendet. Ich denke, es bombardiert auch zuerst, wenn es nicht Null ist. (In anderen Ubuntu-Installationen ist einwandfreies shebang kein Problem)

teknopaul
quelle
0

Sie müssen sicherstellen, dass dies /etc/rc.localwährend des Serverstarts mit dem folgenden Befehl ausgeführt wird:

sudo systemctl enable rc-local.service

Wilhelm
quelle