
also habe ich versucht, das /etc/rc.local
Skript zum Laufen zu bringen, aber beim besten Willen scheint nichts zu funktionieren. Ich kann es manuell ausführen, indem ich verwende service rc.local start
, und es gibt nur „hi“ in eine Datei in meinem Home-Verzeichnis aus, aber beim Neustart wird es nicht ausgeführt. Alle richtigen Berechtigungen scheinen festgelegt zu sein und Links existieren in den richtigen rc#.d-Verzeichnissen. Als Referenz sind hier die relevanten Informationen:
# ls -l /etc/rc.local
-rwxr-xr-x 1 root root 45 Apr 12 21:10 /etc/rc.local
# ls -l /etc/init.d/rc.local
-rwxr-xr-x 1 root root 812 Apr 12 21:00 /etc/init.d/rc.local
# for i in {0..6}; do cd rc$i.d ; pwd; ls -l |grep rc.local; cd ..; done
/etc/rc0.d
lrwxrwxrwx 1 root root 18 Apr 12 20:53 K20rc.local -> ../init.d/rc.local
/etc/rc1.d
lrwxrwxrwx 1 root root 18 Apr 12 20:53 K20rc.local -> ../init.d/rc.local
/etc/rc2.d
lrwxrwxrwx 1 root root 18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc3.d
lrwxrwxrwx 1 root root 18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc4.d
lrwxrwxrwx 1 root root 18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc5.d
lrwxrwxrwx 1 root root 18 Apr 12 20:53 S20rc.local -> ../init.d/rc.local
/etc/rc6.d
lrwxrwxrwx 1 root root 18 Apr 12 20:53 K20rc.local -> ../init.d/rc.local
# cat /etc/rc.local
#! /bin/bash
echo hi > ~user/test
exit 0
Ich habe versucht, sowohl /etc/rc.local
als auch zu löschen, /etc/init.d/rc.local
auszuführen update-rc.d rc.local remove
, sie dann wiederherzustellen und update-rc.d rc.local defaults
wie in dieser Frage auszuführen:Rc.local wird nicht ausgeführt. Das hat nicht funktioniert.
Es funktioniert auch nicht nach einem Neustart oder dem Aufrufen einer Init-Ebene. Es funktionierte nicht, als die Shebang-Zeile #! /bin/sh -e
oder lautete #! /bin/bash
. Wenn ich es manuell ausführe, kann ich jedoch sowohl die /etc/rc.local
als /etc/init.d/rc.local
auch die Skripte in verschiedene Dateien ausgeben lassen.
Meine Frage ist also: Was mache ich falsch und wie kann ich rc.local zum Laufen bringen? Und obwohl ich nichts dagegen habe, von Alternativen (wie Upstart) zu hören, akzeptiere ich nur eine Antwort, die mir zeigt (oder mir hilft, herauszufinden), wie ich rc.local normal zum Laufen bringe (und mir im Idealfall sagt, was schiefgelaufen ist).
Hier sind einige zusätzliche Informationen, falls sie von Nutzen sind:
# dmesg | grep "Linux version"
[ 0.000000] Linux version 3.5.0-17-generic (buildd@allspice) (gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) ) #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 (Ubuntu 3.5.0-17.28-generic 3.5.5)
# cat /proc/version
Linux version 3.5.0-17-generic (buildd@allspice) (gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) ) #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012
# lsb_release -a
No LSB modules are available.
Distributor ID: LinuxMint
Description: Linux Mint 14 Nadia
Release: 14
Codename: nadia
Antwort1
Das Problem besteht darin, dass in dieser Zeile Folgendes gilt:
echo hi > ~user/test
~user
wird nicht wie erwartet erweitert. rc.local
wird ausgeführt, versucht jedoch aufgrund der unerwarteten Erweiterung, an einen Ort zu schreiben, für den es wahrscheinlich keine Berechtigung hat.
Versuchen Sie stattdessen Folgendes:
echo ~user/test > /dev/shm/test
Überprüfen Sie dann den Inhalt von /dev/shm/test
. Dadurch wird sowohl angezeigt, was rc.local
ausgeführt wird, als auch, wohin es erweitert wird ~user
.
Allerdings würde ich empfehlen, explizite Pfade zu verwenden, anstatt sich auf die externe Umgebung zu verlassen.
Antwort2
„Ich habe nichts dagegen, von Alternativen (wie Upstart) zu hören“ impliziert, dass Sie ein paar Dinge nicht verstehen. Ich bin kein Mint-Benutzer, aber anscheinend ist es ein auf Upstart basierendes System. Upstart ist ein Init-Daemon und auf Ihrem System ist nur einer installiert. Upstart ist also keine Alternative; es gibt keine Alternativen –Ihr System verwendet Upstart. Punkt. Es verwendet nichts anderes. Upstart ist jedoch abwärtskompatibel mit Sysvinit-Skripten, d. h. Sie können Dienste verwalten, indem Sie Links in /etc/rc-Verzeichnissen platzieren und einige der alten Befehle wie service
und möglicherweise verwenden update-rc.d
.
Da Sie nach eigener Aussage nicht viel Ahnung davon haben, wie dieses Sysvinit-System funktioniert, ist es meiner Meinung nach Zeitverschwendung, wenn Sie es lernen. Sie könnten genauso gut lernen, wie Ihr echter Init-Daemon funktioniert. Upstart ist ziemlich unkompliziert; bedenken Sie, dass 95 % der Beschwerden darüber (und parallel dazu Beschwerden über systemd auf Fedora-basierten Systemen) einfach von Leuten kommen, die nur einfache Kenntnisse von Sysvinit haben und wütend sind, dass sie möglicherweise ein paar Stunden damit verbringen müssen, etwas Neues zu lernen.
Ich würde also sagen, dass Sie die RC-Verzeichnisse usw. auf Links im Sysvinit-Stil überprüfen sollten, aber angesichts der Frage „Rc.local wird nicht ausgeführt“, auf die Sie verlinkt haben und deren Lösung Ihrer Meinung nach fehlgeschlagen ist, denke ich, dass Sie damit an dieser Stelle Ihre Zeit verschwenden. Vergessen Sie Sysvinit-Kompatibilität und die Verzeichnisse /etc/rc und init.d.
Upstart verarbeitet .conf
Dateien in /etc/init
(Hinweis: nicht init.d). Wenn Sie also ein Skript haben, das Sie beim Booten ausführen möchten, fügen Sie einfach eine .conf-Datei zu /etc/init hinzu. Sie muss nicht ausführbar sein, sollte aber root gehören.
author "You"
start on started local-filesystems
script
/etc/rc.local # but don't really be this lazy, see below
end script
Um künftige Verwirrungen und weiteren Sysvinit-Spielereien vorzubeugen, empfehle ich Ihnen, den Namen des Skripts /etc/rc.local umzubenennen oder, noch besser, einfach den Inhalt in die .conf-Datei zu verschieben (alles zwischen den script
und end script
-Tags wird von der Shell verarbeitet).
Die definitive Referenz für Upstart ist wahrscheinlichdas Upstart-Kochbuch. Wie ich schon sagte, ist es in Bezug auf die Benutzerfreundlichkeit eine Verbesserung gegenüber sysvinit, aber leider gibt es online immer noch wenig anständiges Material darüber und viele verwirrende und unvollständige Dinge. Aber ein Skript beim Booten auszuführen ist so einfach wie gerade beschrieben.
Wenn die .conf-Datei "my-localboot.conf" heißt, können Sie Ihren Dienst testen mit
initctl start my-localboot