WSL: Services automatisch starten
- 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<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.
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.
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.
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
Damit sicher gestellt ist, dass die Services laufen, wenn ich mit dem System arbeite, habe ich:
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.
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.