54 votes

Comment faire en sorte que WSL exécute les services au démarrage ?

Après avoir consulté ce site et divers Q, il est clair que les services et les systemd n'est pas disponible pour le WSL. J'ai besoin de lancer un programme dans WSL à chaque fois que je démarre mon PC, alors j'ai lu cette page sur la façon d'utiliser crontab : Comment lancer le service Ubuntu sur Windows (au démarrage) ? Super utilisateur mais je me suis embrouillé car le format ne correspond pas à celui de la crontab.

En outre, cette question particulière concernait les serveurs SSH, qui exigent que l'aspect sécurité soit pris en compte et traité, ce qui entraîne une complication excessive des étapes. Quoi qu'il en soit, les étapes explorées dans cette question ont été essayées et n'ont pas fonctionné. De plus, cette question est très spécifique aux serveurs SSH, alors que la présente question traite d'une exigence environnementale générale : j'ai besoin de savoir COMMENT exécuter des services dans WSL (ce qui peut inclure, mais ne se limite pas aux serveurs SSH).

En effet - Une solution plus simplifiée est requise que Comment lancer le service Ubuntu sur Windows (au démarrage) ? fournit.

Cependant, c'est mon 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

Je l'ai aussi fait :

Exécuter la boucle bash/cron au démarrage

Créer un fichier appelé linux.bat dans Shell:startup

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

Cela ne fonctionne pas.

Comment faire fonctionner un service en WSL ? Ou y a-t-il un moyen d'utiliser Windows ?

Parce que sous Windows, j'ai essayé ce qui suit : en utilisant 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/

Et comme vous l'avez deviné, ça ne marche toujours pas. Franchement, j'aimerais pouvoir faire cela en WSL, car c'est ma méthode préférée, mais je suis prêt à tout.

J'ai une station de travail avec 96 Go de RAM et je préfère donc l'utiliser comme double machine Linux/Windows plutôt que comme mon petit ordinateur portable.

J'ai effectué des tâches sous Linux et Windows et j'ai vraiment besoin/préfère la solution Linux fournie par Windows.

J'ai examiné l'autre question et il y a un paquet appelé Mysys qui semble fournir une solution, mais cela s'écarte de l'intégration fournie par Microsoft qui était une grande voie à suivre.

32voto

Dans WSL, les distributions linux ne s'exécutent qu'après l'invocation d'une première commande linux. Si vous voulez exécuter un deamon linux (un service), vous devez configurer le serveur en linux et exécuter n'importe quelle commande dans cette distribution linux.

Il y a beaucoup de pages et de réponses qui montrent comment créer un script pour démarrer un WSL linux au démarrage de votre ordinateur .

  • Il existe un wsl-autostart VBS script que vous pouvez utiliser. Vous pouvez installer le script et changer le commands.txt avec des commandes linux personnalisées.
  • Il existe un tutoriel étape par étape pour démarrer automatiquement un serveur ssh sur WSL.
  • Il existe également des options permettant de créer des politiques pour exécuter le programme en tant que tâches initiales (à l'aide de l'option gpedit.msc ) ou une tâche planifiée qui s'exécute au démarrage (en utilisant la commande taskschd.msc ).

NOTE : Si votre programme doit être exécuté avec sudo vous devez le configurer pour qu'il démarre le programme sans demander de mot de passe.

  • Exécuter visudo dans le linux et ajoutez une ligne à la fin du fichier : %sudo ALL=NOPASSWD: /full/path/to/program

28voto

user1126880 Points 281

Mon exemple avec le service mysql

  1. Créer une ligne dans /etc/sudoers (au WSL pour éviter de demander le mot de passe) :

     %sudo   ALL=(ALL) NOPASSWD: /usr/sbin/service mysql start
  2. Créer .bat dans le répertoire de démarrage de Windows avec cette ligne (dir trouver ici : Win + R y shell:startup ):

     wsl sudo service mysql start

Après avoir redémarré le service, il démarrera automatiquement.

7voto

lurker Points 19

Une autre option :

1) Créez un fichier de démarrage sous Linux à l'adresse suivante /etc/init-wsl :

#!/bin/sh
echo booting
service ssh start

et rendre le script exécutable

chmod +x /etc/init-wsl

2) Planifier l'exécution de ce fichier au démarrage ou à l'ouverture de session de Windows

test

Depuis wsl.exe est capable d'exécuter des commandes à l'intérieur de la distro wsl, nous programmons simplement pour exécuter ce fichier via la commande wsl -u root /etc/init-wsl . Si vous avez plusieurs distros, vous pouvez spécifier laquelle avec une option -d par exemple wsl -d Ubuntu-20.04 -u root /etc/init-wsl

7voto

NotTheDr01ds Points 5135

Avec la sortie de Windows 11, une nouvelle fonctionnalité a été ajoutée à WSL pour résoudre ce problème. Pour exécuter n'importe quelle commande arbitraire au démarrage de WSL, créez ou modifiez (en tant que sudo ) /etc/wsl.conf avec le contenu suivant :

[boot]
command="command to run as root; other command to run as root"

Par exemple :

[boot]
command="service ssh start; service cron start"

Ces commandes s'exécutent en tant que root, il n'est donc pas nécessaire d'utiliser la commande sudo avec un mot de passe.

Notez que (actuellement, du moins) si vous tentez d'avoir plusieurs command= seules les lignes dernier sera exécuté. Si vous avez besoin de plusieurs commandes à exécuter au démarrage, séparez-les par un point-virgule comme ci-dessus.

Si vous avez besoin de ces services pour commencer à Windows il suffit de créer une tâche planifiée à l'ouverture de session pour wsl true . Cela va démarrer votre instance WSL, en déclenchant la fonction boot commandes ci-dessus. Comme les services sont en cours d'exécution, l'instance WSL restera en arrière-plan.

Notez que cette fonctionnalité est également disponible dans les versions Developer Preview (Insider) de Windows 10.

4voto

a.t. Points 333

Merci pour votre question, elle m'a guidé vers cette solution. Voici ma solution complète, généralisée et particulière. Elle se compose de 3 étapes :

  1. Créer un cronjob
  2. Exécuter/activer le service cronjob au démarrage
  3. Supprimez la demande de mot de passe pour démarrer le service cronjob automatiquement.

En réalité, votre problème est déjà résolu avec seulement les étapes 2 et 3, mais puisque vous avez essayé de le faire avec un cronjob, j'ai également ajouté cette étape pour être complet.

1. Créer un cronjob fonctionnel :

  1. Parcourir le dossier /etc/
  2. Puis dans le dossier /etc/ Entrez : sudo nano crontab
  3. Dans ce fichier nommé crontab, entrez votre commande.
  4. Par exemple : */1 * * * * root touch /var/www/myFile
  5. Pour créer un fichier nommé myFile à l'emplacement /var/www/ chaque minute.
  6. Pour être complet : */1 * * * * root touch /var/www/myFile signifierait : créer ce fichier toutes les 1ères minutes de l'heure.

Un exemple de la crontab pourrait ressembler (je n'ai ajouté que la dernière ligne, le reste était déjà présent dans mon installation) :

# /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. Activer le service cronjob

Pour exécuter une commande automatiquement au démarrage de WSL Ubuntu 16.04 vous pouvez :

  1. cd à /home/<your ubuntu user name>
  2. sudo nano .bashrc
  3. L'éditeur de texte nano crée/ouvre alors un fichier .bashrc
  4. Dans ce fichier, de nombreux exemples peuvent déjà être montrés, pour simplement exécuter votre commande au démarrage de la WSL ubuntu 16.04, écrivez votre commande sur la première ligne du fichier .bashrc fichier.
  5. Par exemple : echo "hello world" comme le montre l'image ci-dessous.
  6. Pour votre problème particulier, la solution particulière serait d'entrer la ligne : sudo ./xmr-stak-cpu
  7. Fermez l'éditeur avec : ctrl+x
  8. Enregistrez le fichier avec Y
  9. Quitter ubuntu
  10. Redémarrez ubuntu et vérifiez que le hello world est bien imprimé avant votre nom d'utilisateur.

![Un exemple de commande dans .bashrc qui est exécutée au démarrage de WSL ubuntu]. 1

Par exemple, cela pourrait être ce que votre .bashrc ressemble après que vous l'ayez modifié : (j'ai seulement ajouté la première ligne en haut, le reste était déjà là dans ma configuration).

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 "${debian_chroot:-}" ] && [ -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

Vous pouvez remplacer le hello world avec sudo service cron start pour activer le service cronjob. Cependant, vous devez toujours entrer votre mot de passe manuellement.

3. Suppression de la demande de mot de passe : Utilisation : https://askubuntu.com/questions/147241/execute-sudo-without-password

  1. Ouvrir WSL ubuntu 16.04 (terminal)
  2. sudo visudo
  3. Au bas du fichier, ajoutez la ligne : <your WSL ubuntu username> ALL=(ALL) NOPASSWD: ALL
  4. Par exemple, avec le nom d'utilisateur zq, vous devez ajouter la ligne suivante au bas du fichier :
  5. zq ALL=(ALL) NOPASSWD: ALL
  6. ctrl+x pour quitter
  7. y suivi par <enter> à sauver.
  8. Encore une fois, fermez ubuntu et rouvrez-le et vérifiez
  9. Le service cron est exécuté automatiquement lorsque vous démarrez/ouvrez WSL ubuntu 16.04 sans demander de mot de passe.
  10. (vous pouvez vérifier avec la commande : sudo service cron status .)

Le code pour empêcher la demande de mot de passe au démarrage ressemblerait par exemple à (je n'ai ajouté que la dernière ligne, le reste était déjà présent dans ma configuration) :

#
# 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

En travaillant sur cette solution, j'ai appris que les cronjobs sont destinés à exécuter des choses périodiquement plutôt qu'à des événements spécifiques comme le démarrage. Pour exécuter des choses au démarrage dans WSL, vous pouvez utiliser le fichier /home/<username>/.bashrc .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X