Beiträge der WSL Serie
- Windows Subsystem für Linux (WSL)
- WSL: Interaktion zwischen den Systemen (I)
- WSL: Interaktion zwischen den Systemen (II)
- WSL: C++ Entwicklung mit CLion
- WSL: Services automatisch starten
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
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
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
# Start Services if not running
[ "`service ssh status | sed 's/.*not running.*/nok/'`" == "nok" ] && sudo service ssh start
[ "`service dbus status | sed 's/.*not running.*/nok/'`" == "nok" ] && sudo service dbus start
[ "`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.