Wie WSL Dienste beim Start ausführen lässt

1916
seanbw

Nach dem Durchsuchen dieser Site und verschiedener Q ist es klar, dass Services systemdverfügbar sind und nicht für WSL verfügbar sind. Ich muss bei jedem Start eines PCs ein Programm in der WSL ausführen. Ich lese diese Seite, um zu erfahren, wie Sie crontab verwenden: Wie läuft der Ubuntu-Dienst unter Windows (beim Start)? Super User wurde ich aber verwirrt, weil das Format nicht mit dem Format in Crontab übereinstimmt.

Darüber hinaus war diese spezielle Frage spezifisch für SSH-Server, was die Berücksichtigung des Sicherheitsaspekts erfordert und zu einer Überkomplettierung der Schritte führt. Unabhängig davon wurden die in diesem Abschnitt untersuchten Schritte ausprobiert und sie funktionierten nicht. Darüber hinaus ist diese Frage sehr spezifisch für SSH-Server, während sich diese Frage mit einer allgemeinen Anforderung an die Umwelt befasst, z. Ich muss wissen, wie man Dienste in WSL ausführt (dies kann SSH-Serrvers beinhalten, ist aber nicht darauf beschränkt).

In der Tat - Eine vereinfachte Lösung ist erforderlich, wie der Ubuntu-Dienst unter Windows (beim Start) ausgeführt wird. bietet.

Dies ist jedoch mein Cron:

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin PATH=cd /usr/local/src/:cd xmr-stak-cpu:cd bin/ @reboot . sudo ./xmr-stak-cpu 

Ich habe das auch gemacht:

Führen Sie die bash / cron-Schleife beim Start aus

Erstellen Sie eine Datei mit dem Namen linux.bat in shell: startup

Paste: C:\Windows\System32\bash.exe -c 'while [ true ]; do sudo /usr/sbin/cron -f; done' 

Es funktioniert nicht.

Wie kann ich einen Dienst in der WSL ausführen? Oder gibt es eine Möglichkeit, Windows zu verwenden?

In Windows habe ich Folgendes versucht: mit https://github.com/Microsoft/WSL/issues/612

Run: When the computer starts,  Action: Start a program,  Program: c:\Windows\system32\bash.exe,  Arguments: -c "sudo /xmr-stak-cpu/bin/xmr-stak-cpu -D" Start in: /usr/local/src/ 

Und wie Sie vermuteten, funktioniert es immer noch nicht. Ehrlich gesagt wünschte ich mir, ich könnte dies in der WSL tun, weil es meine bevorzugte Art ist, aber ich werde jeden Weg gehen.

Ich habe eine Workstation mit 96 GB RAM und möchte diese als Dual-Linux / Windows-Maschine und nicht als meinen miesen Laptop verwenden.

Ich habe Aufgaben sowohl unter Linux als auch unter Windows und benötige / bevorzuge die Linux-Lösung von Windows.

Ich habe die andere Frage überprüft und es gibt ein Paket namens Mysys, das eine Lösung zu bieten scheint, dies weicht jedoch von der Integration ab, die von Microsoft bereitgestellt wurde.

2
Mögliches Duplikat von [Wie wird der Ubuntu-Dienst unter Windows ausgeführt (beim Start)?] (Https://superuser.com/questions/1112007/how-to-run-ubuntu-service-on-windows-at-startup) Biswapriyo vor 5 Jahren 1
Es ist KEIN mögliches Duplikat, sondern eine Erweiterung davon. Die in dieser Frage untersuchten Routinen gehen weit über das hinaus, was ich brauche. Darüber hinaus ist dies eine spezifische Frage, auf die sich auch diese Frage bezieht. Sie haben diese Frage nicht gelesen, oder? seanbw vor 5 Jahren 1
Wenn Sie Ihre Frage überprüfen, führen Sie "sudo ... xmr-stak-cpu" mit einer geplanten Aufgabe aus. - Haben Sie `visudo` ausgeführt und die`% sudo ALL = NOPASSWD: / xmr-stak-cpu / bin / xmr-stak-cpu` eingeschlossen, um Probleme mit dem Befehl zu vermeiden, der nach einem Kennwort fragt? Brauchen Sie (wirklich) den Sudo? Kannst du den Miner ohne Sudo-Privilegien betreiben? Jaime vor 5 Jahren 0

2 Antworten auf die Frage

3
Jaime

In WSL werden die Linux-Distributionen nur ausgeführt, nachdem ein erster Linux-Befehl aufgerufen wurde. Wenn Sie einen Linux-Deamon (einen Dienst) ausführen möchten, müssen Sie den Server in Linux konfigurieren und einen beliebigen Befehl in dieser Linux-Distribution ausführen.

Es gibt viele Seiten und Antworten, die zeigen, wie Sie ein Skript zum Starten einer WSL-Linux beim Starten Ihres Computers erstellen .

  • Es gibt ein wsl-autostart-VBS-Skript, das Sie verwenden können. Sie können das Skript installieren und commands.txtmit benutzerdefinierten Linux-Befehlen ändern .
  • Es gibt eine schrittweise Anleitung zum automatischen Starten eines SSH-Servers in der WSL.
  • Es gibt auch Optionen zum Erstellen von Richtlinien, um das Programm als erste Aufgaben (mit dem gpedit.mscBefehl) oder als geplante Aufgaben auszuführen, die beim Start (mit taskschd.msc) ausgeführt werden.

HINWEIS: Wenn Ihr Programm mit ausgeführt sudowerden muss, müssen Sie es so konfigurieren, dass das Programm ohne Eingabe eines Kennworts gestartet wird.

  • Führen Sie visudoin Linux aus und fügen Sie am Ende der Datei eine Zeile hinzu:%sudo ALL=NOPASSWD: /full/path/to/program
Dies mag die Lösung sein, nach der ich suche. Ich werde versuchen zu sehen, ob ich es hacken kann seanbw vor 5 Jahren 0
Warum wurde dies bestraft? seanbw vor 5 Jahren 0
+1 für das WSL-Autostart-Skript. Der einzige Nachteil ist, dass bei jedem Start eine UAC-Eingabeaufforderung ausgelöst wird ...: / Inigo vor 5 Jahren 0
... So habe ich das wsl-autostart-Skript verwendet, aber die Anweisungen, die Sie zum Erstellen eines Startelements in der Registrierung auffordern, überspringen. Verwenden Sie stattdessen den Taskplaner, um eine Task zu erstellen, die die Datei `start.vbs` beim Anmelden mit maximaler Benutzerberechtigung ausführt. Ich kann dies jetzt ausführen, um den cron-Dienst in WSL jedes Mal, wenn ich meine Maschinenwerke starte, wie ein Traum zu starten;) Inigo vor 5 Jahren 1
1
a.t.

Vielen Dank für Ihre Frage, sie hat mich zu dieser Lösung geführt. Dies ist meine vollständige, verallgemeinerte und besondere Lösung. Es besteht aus 3 Schritten:

  1. Erstellen Sie einen Cronjob
  2. Den cronjob-Dienst beim Start ausführen / aktivieren
  3. Entfernen Sie die Aufforderung zur Eingabe eines Kennworts, um den Cronjob-Dienst automatisch zu starten.

In der Realität ist Ihr Problem bereits mit den Schritten 2 und 3 gelöst, aber da Sie versucht haben, dies mit einem Cronjob zu tun, habe ich diesen Schritt der Vollständigkeit halber hinzugefügt.

1. Einen funktionierenden Cronjob erstellen:

  1. Navigieren Sie zum Ordner /etc/
  2. Dann in Ordner /etc/eingeben:sudo nano crontab
  3. Geben Sie in dieser Datei namens crontab Ihren Befehl ein.
  4. Z.B: */1 * * * * root touch /var/www/myFile
  5. Jede Minute eine Datei mit dem Namen " myFilelocation" erstellen /var/www/.
  6. Für die Vollständigkeit: */1 * * * * root touch /var/www/myFilewürde bedeuten: Erstellen Sie diese Datei jede 1. Minute der Stunde.

Ein Beispiel für die crontabDatei könnte aussehen (ich habe nur die letzte Zeile hinzugefügt, der Rest war bereits in meinem Setup vorhanden):

# /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do.  SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin  # m h dom mon dow user command */2 * * * * root touch /var/www/myFile 

2. Aktivieren des Cronjob-Dienstes

Um einen Befehl automatisch beim Start von WSL Ubuntu 16.04 auszuführen, können Sie:

  1. CD zu /home/<your ubuntu user name>
  2. sudo nano .bashrc
  3. Der Texteditor nano erstellt / öffnet dann eine Datei .bashrc
  4. In dieser Datei können bereits viele Beispiele gezeigt werden. Um Ihren Befehl beim Start der WSL ubuntu 16.04 auszuführen, schreiben Sie Ihren Befehl in die erste Zeile der .bashrcDatei.
  5. Zum Beispiel: echo "hello world"wie im Bild unten gezeigt.
  6. Für Ihr spezielles Problem wäre die spezielle Lösung die Eingabe der Zeile:sudo ./xmr-stak-cpu
  7. Schließen Sie den Editor mit: ctrl+x
  8. Speichern Sie die Datei mit Y
  9. Beenden Sie Ubuntu
  10. Starten Sie ubuntu neu und überprüfen Sie, ob die Hallo-Welt vor Ihrem Benutzernamen gedruckt wird.

! [Ein Beispielbefehl in .bashrc, der beim Booten von WSL Ubuntu ausgeführt wird.] 1

Zum Beispiel könnte dies .bashrcnach dem Bearbeiten so aussehen: (Ich habe nur die erste Zeile oben hinzugefügt, der Rest war bereits in meinem Setup vorhanden.)

sudo -i service cron start # ~/.bashrc: executed by bash(1) for non-login shells. # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) # for examples  # If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac  # don't put duplicate lines or lines starting with space in the history. # See bash(1) for more options HISTCONTROL=ignoreboth  # append to the history file, don't overwrite it shopt -s histappend  # for setting history length see HISTSIZE and HISTFILESIZE in bash(1) HISTSIZE=1000 HISTFILESIZE=2000  # check the window size after each command and, if necessary, # update the values of LINES and COLUMNS. shopt -s checkwinsize  # If set, the pattern "**" used in a pathname expansion context will # match all files and zero or more directories and subdirectories. #shopt -s globstar  # make less more friendly for non-text input files, see lesspipe(1) [ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"  # set variable identifying the chroot you work in (used in the prompt below) if [ -z "$" ] && [ -r /etc/debian_chroot ]; then debian_chroot=$(cat /etc/debian_chroot) fi  # set a fancy prompt (non-color, unless we know we "want" color) case "$TERM" in xterm-color|*-256color) color_prompt=yes;; esac  # uncomment for a colored prompt, if the terminal has the capability; turned # off by default to not distract the user: the focus in a terminal window # should be on the output of commands, not on the prompt #force_color_prompt=yes  if [ -n "$force_color_prompt" ]; then if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then # We have color support; assume it's compliant with Ecma-48 # (ISO/IEC-6429). (Lack of such support is extremely rare, and such # a case would tend to support setf rather than setaf.) color_prompt=yes else color_prompt= fi fi 

Sie können den hello worldBefehl durch ersetzen sudo service cron start, um den Cronjob-Dienst zu aktivieren. Dann müssen Sie Ihr Passwort jedoch noch manuell eingeben.

3. Eingabeaufforderung für Kennwort entfernen: Verwenden Sie Folgendes : https://askubuntu.com/questions/147241/execute-sudo-without-password

  1. WSL ubuntu 16.04 (Terminal) öffnen
  2. sudo visudo
  3. Am Ende der Datei-Zeile hinzufügen: <your WSL ubuntu username> ALL=(ALL) NOPASSWD: ALL
  4. Mit dem Benutzernamen zq würden Sie beispielsweise die folgende Zeile am Ende der Datei einfügen:
  5. zq ALL=(ALL) NOPASSWD: ALL
  6. Strg + x zum Beenden
  7. ygefolgt von <enter>zum Speichern.
  8. Dann wieder schließen Sie Ubuntu und öffnen Sie es erneut und überprüfen Sie
  9. Der Cron-Dienst wird automatisch ausgeführt, wenn Sie WSL ubuntu 16.04 starten / öffnen, ohne das Kennwort einzugeben.
  10. (Sie können mit dem Befehl überprüfen:. sudo service cron status)

Der Code zum Verhindern der Aufforderung zur Eingabe eines Kennworts beim Boot würde beispielsweise so aussehen (ich habe nur die letzte Zeile hinzugefügt, der Rest war bereits in meinem Setup vorhanden):

# # This file MUST be edited with the 'visudo' command as root. # # Please consider adding local content in /etc/sudoers.d/ instead of # directly modifying this file. # # See the man page for details on how to write a sudoers file. # Defaults env_reset Defaults mail_badpass Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/s$ # Host alias specification  # User alias specification  # Cmnd alias specification  # User privilege specification root ALL=(ALL:ALL) ALL  # Members of the admin group may gain root privileges %admin ALL=(ALL) ALL  # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL  # See sudoers(5) for more information on "#include" directives:  #includedir /etc/sudoers.d %sudo ALL=NOPASSWD: /etc/init.d/cron zq ALL=(ALL) NOPASSWD: ALL 

Auf diese Lösung hin habe ich gelernt, dass Cronjobs dazu gedacht sind, dass Dinge regelmäßig ausgeführt werden und nicht bei bestimmten Ereignissen wie dem Startup. Um Dinge beim Start in WSL auszuführen, können Sie die Datei verwenden /home/<username>/.bashrc.

Kopieren Sie einen Abschnitt aus der `.bashrc`-Datei in Ihre Antwort, damit der Leser nach der Bearbeitung erfahren kann, wie er aussieht. Biswapriyo vor 5 Jahren 1
@Biswapriyo, vielen Dank für Ihr Feedback. Anfangs habe ich einen Screenshot dieses Codes hinzugefügt, konnte ihn aber nicht zum Laufen bringen. Also habe ich den eigentlichen Code eingefügt. a.t. vor 5 Jahren 0