
Ich bin ehrlich gesagt nicht sicher, ob dies ein Problem mit WSL ist oder ob ich bei Ubuntu allgemein einfach etwas falsch mache, aber ich kann den Cron-Dienst beim Start auf meinem WSL-System nicht zum Laufen bringen.
Es fängt ganz gut an mit:
sudo service cron start
Aber es startet beim Booten nicht, auch nicht nach:
sudo update-rc.d cron defaults
sudo update-rc.d cron enable
Ausführung:
$ uname -a
Linux PC-01 4.4.0-18362-Microsoft #476-Microsoft Fri Nov 01 16:53:00 PST 2019 x86_64 x86_64 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.4 LTS
Release: 18.04
Codename: bionic
Antwort1
Alte Frage, die ich gerade gefunden habe, als ich nach einem potenziellen „Duplikat“ für eine andere Frage gesucht habe, die gerade gestellt wurde. Ich stelle die Antwort hier ein, da dies das erste Suchergebnis für „wsl start services“ ist.
Da ist einaktuellAntwort und eineZukunftAntwort (basierend auf den derzeit verfügbaren Windows 10/11-Vorschauversionen von WSL).
Die aktuelle Antwort ist, dass WSL das Konzept von „Startup Services“ nicht kennt. Der init
Prozess von Microsoft ist weder ein SysVinit noch ein Systemd-Init wie auf „normalen“ Linux-Systemen.
Wenn Sie die Dienste automatisch starten möchten, gibt esmomentanEs gibt zwei Möglichkeiten, dies zu tun, eine dritte kommt in der nächsten WSL-Version:
Option 1: Richten Sie eine „Geplante Aufgabe“ von Windows ein, die beim Anmelden (nicht beim Booten) ausgeführt wird:
- Die Aufgabe kann eine „Basisaufgabe“ sein, um
- „Programm starten“
- Das "Programm" ist
wsl.exe
- Und die "Argumente" sollten sein
-u root service cron start
Dadurch wird WSL bei der Anmeldung als Root-Benutzer (erforderlich zum Starten von Diensten) ausgeführt und der
service cron start
Befehl ausgeführt. Dies kann natürlich geändert werden, um jeden Dienst auszuführen, der über eininit.d
Skript verfügt. Beachten Sie, dass dies (zumindest derzeit) nicht funktioniert, wenn Sie die Aufgabe so planen, dass sie beim Windows-Start ausgeführt wird, da WSL anscheinend erfordert, dass der Benutzer angemeldet ist, damit der Prozess im Hintergrund ausgeführt wird.
Option 2: Ändern Sie Ihren Shell-Start, um zu prüfen, ob der Dienst ausgeführt wird, und starten Sie ihn bei Bedarf.
Fügen Sie in Ihrem Startvorgang (normalerweise
~/.bashrc
) die folgende Zeile hinzu:wsl.exe -u root sh -c "service cron status || service cron start"
Unter „normalem“ Linux müssen Sie
visudo
sich selbst die Berechtigung erteilen, den Befehl ohne Passwort auszuführen (oder das Passwort bei jeder Anmeldung eingeben). Verwenden Siewsl.exe -u root
frominnerhalbMit WSL können Sie dies umgehen.
Option 3: Eine neue Funktion in Windows 11 ist die Möglichkeit, Startaufgaben für WSL mithilfe der
/etc/wsl.conf
Datei anzugeben. Wenn Sie Windows 11 haben, erstellen Sie diese Datei mit den folgenden Zeilen:[boot] command="service cron start"
Entsprechend derMicrosoft-Dokument, dadurch wird der Befehl als Root ausgeführt, wenn die WSL-Instanz gestartet wird.
Wenn Sie beim WSL-Start mehrere Befehle ausführen müssen, trennen Sie diese in derselben
command
Zeile durch Semikolons:[boot] command="service ssh start; service cron start"
Antwort2
Dieser Beitrag hat mir geholfen, das zu finden, was ich suchte. Allerdings musste ich mehrere Befehle ausführen (xrdp starten, eth0 mtu optimieren, resolv.conf aktualisieren) und die wsl.exe
mehrmalige Ausführung würde mehrere Root-Anmeldungen instanziieren, was einige Probleme mit der Dateisperre verursachte, resolv.conf
möglicherweise weil WSL bei jeder Anmeldung einige Einstellungen vornimmt, nicht sicher.
Ich verwende wsl2 Kernel-Version: 5.10.102.1 Windows 10 mit Ubuntu 20.04.5 LTS. Meine Anforderungen waren
- Starten Sie xrdp (damit ich eine Verbindung zu einer GUI-Sitzung herstellen kann)
- Stellen Sie eth0 mtu auf 1350 ein (WSL hatte aufgrund von mtu Verbindungsprobleme bei VPN)
- Update
resolv.conf
mit Upstream-Resolvern (wurde ständig von WSL aktualisiert, unabhängig vongenerateResolvConf = false
inwsl.config
)
Um die Antwort von @NotTheDr01ds zu erweitern, hier ist, was ich getan habe.
- Alle Befehle in ein neues Shell-Skript
.mystartup.sh
im Home-Verzeichnis einfügen - Rufen Sie
.mystartup.sh
als Root auf von.profile
Hier ist, was ich hinzugefügt habe.profile
# startup stuff
# run startup script as root
wsl.exe -u root /home/user/.mystartup.sh
Und hier ist.mystartup.sh
# startup stuff
# service xrdp start
service xrdp status || service xrdp start
# setup lower mtu for vpn links
ifconfig eth0 mtu 1350
echo "eth0 mtu updated!"
# remove link to /run/resolvconf/resolv.conf & create new
rm -f /etc/resolv.conf
touch /etc/resolv.conf
chmod u+rwx,g+rwx,o+rx /etc/resolv.conf
# setup nameservers
echo "# this resolv.conf created using user .profile script" >> /etc/resolv.conf
echo "# wsl auto-generate must be disabled in /etc/wsl.config" >> /etc/resolv.conf
echo "nameserver 10.0.0.50" >> /etc/resolv.conf
echo "nameserver 10.0.0.51" >> /etc/resolv.conf
echo "resolv.conf modified with custom dns resolvers!"
echo