WSL: Services automatisch starten

Beiträge der WSL Serie

Wir haben im letzten Blog ssh installiert und den Service gestartet.

Wenn wir aber Windows neu gestartet oder WSL mit „wsl -t debian“ beendet haben, dann mussten wir feststellen, dass der ssh Service nicht mehr lief.

WSL startet kein Linux System, wie wir es von vollwertigen Installationen gewohnt sind. Dies kann man auch gut erkennen, wenn wir einmal systemctl aufrufen:

konrad@ZBook15G2:~$ systemctl<br></br>System has not been booted with systemd as init system (PID 1). Can't operate.<br></br>Failed to connect to bus: Host is down<br></br>konrad@ZBook15G2:~$

Dies ist sehr ärgerlich, denn davon sind alle Dienste betroffen. Aber wir wollen ggf. ja cron Einträge machen oder oder per ssh zugreifen. Daher müssen wir dafür sorgen, dass die Dienste, die wir brauchen, gestartet werden.

Schritt 1: sudo ohne Passwort aufrufen

Damit wir generell services manipulieren können, ohne dass ein Passwort eingegeben werden muss, tragen wir dies bei sudoers ein:

echo "%sudo   ALL=(ALL) NOPASSWD: /usr/sbin/service *" > /etc/sudoers.d/service

Danach können wir nun den service Befehl mittels sudo aufrufen ohne dass wir unser Passwort eingeben müssen.

Schritt 2: Prüfen, ob ein Service läuft

Nun können wir prüfen, ob ein Service läuft. Den Status von ssh können wir mittels

service ssh status

anzeigen lassen.

In einem Script können wir den Status auswerten und bei Bedarf den Service neu starten:

[ "`service ssh status | sed 's/.*not running.*/nok/'`" == "nok" ] && sudo service ssh start

Damit wird in der Ausgabe nach „not running“ gesucht um aus dem ganzen Text ein „nok“ zu machen. So das erfolgreich war, wird der Service neu gestartet.

Schritt 3: Script, das alle Services startet, die wir brauchen

In dem Homelaufwerk von meinem User habe ich ein Script services.sh erstellt:

#!/bin/bash<br></br># Start Services if not running<br></br><br></br>[ "`service ssh status | sed 's/.*not running.*/nok/'`" == "nok" ] && sudo service ssh start<br></br>[ "`service dbus status | sed 's/.*not running.*/nok/'`" == "nok" ] && sudo service dbus start<br></br>[ "`service cron status | sed 's/.*not running.*/nok/'`" == "nok" ] && sudo service cron start

Schritt 4: Automatisches Starten des Scripts

Damit sicher gestellt ist, dass die Services laufen, wenn ich mit dem System arbeite, habe ich:

Autostart

Im Autostart ein Shortcut erstellt, welcher aufruf:

wsl.exe bash ~/services.sh

Dadurch werden alle Services in meinem Windows Subsystem für Linux gestartet, wenn ich mich anmelde.

.bashrc

In meiner .bashrc habe ich den Aufruf ~/services.sh aufgenommen. Somit wird bei jedem Öffnen einer Shell noch einmal geprüft, ob die Services alle laufen.