WSL Run Service beim Start

WSL Run Service beim Start

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 initProzess 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" istwsl.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 startBefehl ausgeführt. Dies kann natürlich geändert werden, um jeden Dienst auszuführen, der über ein init.dSkript 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 visudosich selbst die Berechtigung erteilen, den Befehl ohne Passwort auszuführen (oder das Passwort bei jeder Anmeldung eingeben). Verwenden Sie wsl.exe -u rootfrominnerhalbMit 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.confDatei 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 commandZeile 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.exemehrmalige Ausführung würde mehrere Root-Anmeldungen instanziieren, was einige Probleme mit der Dateisperre verursachte, resolv.confmö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

  1. Starten Sie xrdp (damit ich eine Verbindung zu einer GUI-Sitzung herstellen kann)
  2. Stellen Sie eth0 mtu auf 1350 ein (WSL hatte aufgrund von mtu Verbindungsprobleme bei VPN)
  3. Update resolv.confmit Upstream-Resolvern (wurde ständig von WSL aktualisiert, unabhängig von generateResolvConf = falsein wsl.config)

Um die Antwort von @NotTheDr01ds zu erweitern, hier ist, was ich getan habe.

  1. Alle Befehle in ein neues Shell-Skript .mystartup.shim Home-Verzeichnis einfügen
  2. Rufen Sie .mystartup.shals 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

verwandte Informationen