Aktualisieren

Aktualisieren

Normalerweise verwende ich das Linux-Subsystem, wenn ich etwas unter Windows 10 programmiere, daher sind alle meine Pfade relativ zu ~. Ich habe ein Python-Skript, das für immer im Hintergrund läuft, bis ich den Prozess beende. Wie würde ich das unter Windows 10 Bash ohne offenes Terminal machen?

Dinge, die ich versucht habe:

  • bash -c "python3 script.pyvon Run.
  • nohup python3 -u script.pyund schließen Sie dann das Terminal.
  • setsid python3 script.pyund schließen Sie dann das Terminal.

Nichts davon hat funktioniert. Gibt es eine Möglichkeit, dies zu tun? Gibt es alternativ eine Möglichkeit, die Pfade so zu ändern, dass sie funktionieren, wenn ich das Skript von W10 UND Bash aus ausführe, ohne sie jedes Mal umstellen zu müssen?

Antwort1

Eine neue Ergänzung zu WSL ermöglicht das Starten von WSL-Befehlen direkt über das Menü „Ausführen“ oder „Start“. Sie können dem Befehl ein Et-Zeichen anhängen (normales Shell-Verhalten), was zu einem vorübergehenden bashTerminal führt, das sofort verschwindet, aber den Befehl fortsetzt.

Beispiele innerhalbStarte den Lauf:

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

SleepWenn Sie in den Task-Manager von Windows gehen, wird dort ein - oder -Befehl angezeigt, der Python220 Sekunden lang ausgeführt wird und sich dann selbst löscht.

Ich habe festgestellt, dass Umgebungsvariablen nicht verfügbar sind. DISPLAYWenn beispielsweise in der normalen Windows-Methode festgelegt, wird es nicht an WSL übergeben. Dafür muss es eine Möglichkeit geben, diese Variablen zu übergeben. Auch wenn der Befehl das Festlegen der benötigten Variablen über ein Befehlszeilenargument nicht unterstützt, ist es möglich, dies selbst zu tun bash:

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

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

NB: Ich verwende derzeit win10_64, Version 1709 (OS Build 16299.64).

Antwort2

Aktualisieren

Microsoft hat dieses Problem behoben. Hintergrund-/Daemonprozesse dürfen jetzt auch dann weiter ausgeführt werden, wenn sie bash.exe(oder andere WSL-Startprozesse) geschlossen wurden. Ein aktueller Build von Win10 (Frühjahr 2018 für öffentliche Releases, Build 17046 oder höher) ist erforderlich.

Das Folgende bleibt für die Nachwelt erhalten.


Leider/absurderweise gibt es keine Möglichkeit, dies zu tun. Microsoft hat in seiner unendlichen Weisheit entschieden, dass WSL (Windows Subsystem for Linux) nur ausgeführt wird, während Sie einen bash.exeProzess geöffnet haben. Schließen Sie den letzten (oder schließen Sie möglicherweise sogar den letztenFenster; ich bin nicht sicher, ob es den Headless-Betrieb verträgt) und WSL wird heruntergefahren, wobei alle seine Prozesse beendet werden.

Die Begründung dafür war „Ressourcen sparen“, was auf mehreren Ebenen absurd ist, vor allem aber, weil mein Computer diese Ressourcen hat und sie da sind, um genutzt zu werden! Wenn ich möchte, dass ein Prozess ausgeführt wird, sollte er ausgeführt werden; wenn ich nicht möchte, dass er ausgeführt wird, kann ich ihn beenden. Für etwas, das ausdrücklich als Entwicklertool gedacht ist, hat man manchmal das Gefühl, dass WSL nur als Spielzeug verwendet werden kann und dass man seinen Benutzern nicht vertrauen kann, dass sie wissen, was sie tun.

Wenn Sie dies jedoch beheben möchten, stimmen Sie fürErwägen Sie die Aktivierung von Cron-Jobs, Daemons und HintergrundaufgabenAndie UserVoice-Seite. Es handelt sich derzeit um die Anfrage mit den zweitmeisten Stimmen und sie befindet sich „auf der Warteliste“.

Antwort3

Ja, im Moment ist es "unmöglich".

Aber mit ein paar Tricks ist es möglich, es wie einen Hintergrundprozess „erscheinen“ zu lassen. Ich selbst wollte diese Funktionalität unbedingt haben, also habe ich nach ein paar Stunden eine beschissene, aber funktionierende Lösung gefunden.

Der Hauptpunkt besteht darin, eine unsichtbare Shell zu erstellen, in der Sie WSL Bash mit VBScript starten. Sie können dieses Skript dann beim Start ausführen lassen. Die ordnungsgemäße Aufgabenplanung funktionierte aus irgendeinem seltsamen Grund nicht.

Um Daemons auf Linux-Seite zu aktivieren, können Sie über Ihr eigenes rudimentäres Startsystem verfügen, das beispielsweise .bashrc missbraucht.

Der Vorgang wird hier in diesem Dokument, das ich geschrieben habe, ausführlich beschrieben.https://emil.fi/bashwin. Ich habe keine Aufgabenüberwachung implementiert, aber sie sollte ziemlich einfach zu erweitern sein.

Antwort4

Es hat ewig gedauert, aber ich habe einen unglaublich komplizierten Weg gefunden, es zu tun (aus einer Batchdatei):

start bash -c "DISPLAY=:0 [command] & (sleep 0.5 && kill -n 9 $$)"

Hier ist eine Aufschlüsselung dessen, was es bewirkt und warum:

  • `start`: um das Batchdateifenster zu verschwinden
  • `bash -c`: ermöglicht Ihnen, einen Bash-Befehl auszuführen
  • `DISPLAY=:0`: setzt Ihren X-Server
  • `[Befehl]`: Ihr Befehl/Ihre Befehle (`[Befehl && [Befehl]`)
  • `&`: um den nächsten Befehl danach auszuführenbeginntund nicht, wenn esErledigt
  • `sleep 0.5`: um sicherzustellen, dass der Prozess gestartet wurde
  • `&&`: um den nächsten Befehl auszuführen, nachdem erErledigtund nicht, wenn esbeginnt
  • `kill -n 9 $$`: um die Bash-Shell zu beenden, so dass nur noch die grafische Anwendung übrig bleibt

Hinweis: DISPLAY=:0Legt es auf dem X-Server unter fest :0. Um es beispielsweise in zu ändern :1, führen Sie folgende Schritte DISPLAY=:1aus usw.

Hinweis: startist nur erforderlich, wenn es aus einem Batch-Skript stammt. Wenn es aus dem Terminal kommt, brauchen Sie dies nicht

Hinweis: sleepmuss für jede Anwendung anders eingestellt werden. Möglicherweise müssen Sie es sogar weglassen.

verwandte Informationen