web-dev-qa-db-fra.com

Exécution d'un processus d'arrière-plan bash sous Windows 10 sans terminal ouvert

J'utilise généralement le sous-système Linux lorsque je programme quoi que ce soit sur Windows 10, de sorte que tous mes chemins sont relatifs à ~. J'ai un script python qui fonctionne pour toujours en arrière-plan jusqu'à ce que je tue le processus. Comment ferais-je cela sur Windows 10 bash sans un terminal ouvert?

Choses que j'ai essayées:

  • bash -c "python3 script.py de Run.
  • Nohup python3 -u script.py puis ferme le terminal.
  • setsid python3 script.py puis ferme le terminal.

Aucun de ceux-ci n'a fonctionné. Y a-t-il un moyen de faire cela? Sinon, existe-t-il un moyen de modifier les chemins pour qu'ils fonctionnent si je lance le script à partir de W10 AND bash sans avoir à les permuter à chaque fois?

11
Ash

Un ajout récent à WSL permet de lancer des commandes wsl directement à partir du menu "Exécuter" ou Démarrer. Vous pouvez ajouter une esperluette à la commande (comportement normal du shell), ce qui aboutit à un terminal momentané bash qui disparaît immédiatement mais la commande continue.

Exemples, dans Démarrer "Exécuter :

wsl sleep 20 &
wsl python -c 'import time; time.sleep(20);' &

Si vous allez dans le Gestionnaire des tâches de Windows, une commande Sleep ou Python2 sera exécutée pendant 20 secondes, puis effacée automatiquement.

Une chose que j'ai trouvée est que les variables d'environnement ne sont pas disponibles. Par exemple, DISPLAY, s'il est défini dans la méthode windows normale, n'est pas transmis à WSL. Pour cela, il doit y avoir un moyen de passer ces variables. Même si la commande ne prend pas en charge la définition de la variable requise via un argument de ligne de commande, il est possible de le faire à l'aide de bash lui-même:

# direct, command-dependent
wsl emacs --display=:0 &

# indirect, more flexible
wsl bash -c "DISPLAY=:0 emacs" &

NB: J'utilise actuellement win10_64, version 1709 (OS Build 16299.64).

6
r2evans

Mettre à jour

Microsoft a résolu ce problème. Les processus en arrière-plan/démon sont maintenant autorisés à continuer à s'exécuter même après la fermeture de bash.exe (ou d'un autre processus de lancement WSL). Une version récente de Win10 (printemps 2018 pour les versions publiques, build 17046 ou supérieure) est requise.

Le dessous est préservé pour la postérité.


Malheureusement/absurdement, il n’ya aucun moyen de le faire. Microsoft, dans son infinie sagesse, a décidé que WSL (Windows Subsystem for Linux) ne fonctionnerait que si un processus bash.exe était ouvert. Fermez le dernier (ou éventuellement même la dernière fenêtre ; je ne sais pas si elle tolérera être exécutée sans tête) et WSL s'arrête, tuant tous ses processus.

La justification en était "de conserver les ressources", ce qui est absurde à plusieurs niveaux mais surtout parce que, bon sang, mon ordinateur a ces ressources et elles sont là pour être utilisées! Si je veux qu'un processus s'exécute, il devrait l'être; si je ne veux pas que ça tourne, je peux le tuer. Lorsque quelque chose est explicitement conçu comme un outil de développement, on a parfois l’impression que WSL n’est utilisable que comme un jouet et on ne peut faire confiance à ses utilisateurs pour savoir ce qu’ils font.

Quoi qu'il en soit, si vous souhaitez résoudre ce problème, votez pour . Envisagez d'activer les tâches cron, les démons et les tâches en arrière-plan sur la page UserVoice. . C'est actuellement la deuxième demande la plus votée et elle est "en retard".

12
CBHacking

Oui, c'est "impossible" pour le moment.

Mais il est possible de le faire "apparaître" comme un processus d'arrière-plan compliqué. Je voulais cette fonctionnalité plutôt mal moi-même, alors après quelques heures, j'ai trouvé une solution merdique mais efficace.

L'essentiel est de créer un shell invisible sur lequel vous lancez WSL Bash avec VBScript. Vous pouvez ensuite faire exécuter ce script au démarrage. Une bonne planification des tâches n'a pas fonctionné pour une raison étrange.

Pour activer les démons sous Linux, vous pouvez avoir votre propre système de démarrage rudimentaire qui abuse de .bashrc par exemple.

Le processus est détaillé ici dans ce document. J'ai écrit https://emil.fi/bashwin . Je n'ai pas mis en œuvre de surveillance des tâches, mais cela devrait être assez facile à étendre.

2
Emil

Avez-vous essayé cette solution?

Il utilise un assistant WSH pour lancer toute application masquée.

Ensuite, vous pouvez simplement créer une nouvelle tâche dans Tak Scheduler pour lancer la commande lorsque vous vous connectez. Quelque chose comme wscript <path to runHidden.vbs> bash.exe -c "python script.py"

1
Magnus

Je ne sais pas si le gestionnaire de service Windows (SrvMan) de http://tools.sysprogs.org/srvman/ fonctionnerait pour vous, mais cela a fonctionné pour moi pour d'autres programmes. En fait, j'ai essayé de lancer "bash.exe" en tant que service pour voir si cela fonctionnerait, et je suppose que je dois bricoler un peu plus pour que LAMP fonctionne réellement en arrière-plan.

0
Charles McDonald