wake-up-neo.net

Ausführen eines Bash-Hintergrundprozesses unter Windows 10 ohne ein geöffnetes Terminal

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

Dinge, die ich versucht habe:

  • bash -c "python3 script.py von Run.
  • Nohup python3 -u script.py dann das Terminal schließen.
  • setsid python3 script.py dann das Terminal schließen.

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 über W10 AND bash ausführe, ohne sie jedes Mal umschalten zu müssen?

11
Ash

Ein kürzlich in WSL hinzugefügter Befehl ermöglicht das Starten von wsl-Befehlen direkt über das Menü 'run' oder 'Start'. Sie können ein kaufmännisches Und an den Befehl anhängen (normales Shell-Verhalten), was zu einem vorübergehenden Terminal bash führt, das sofort verschwindet, der Befehl jedoch fortgesetzt wird.

Beispiele innerhalb von Start "Ausführen :

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

Wenn Sie in den Task-Manager von Windows wechseln, wird der Befehl Sleep oder Python2 20 Sekunden lang ausgeführt und dann automatisch gelöscht.

Ich habe festgestellt, dass Umgebungsvariablen nicht verfügbar sind. Beispielsweise wird DISPLAY, falls in der normalen Windows-Methode festgelegt, nicht an die WSL übergeben. Dazu 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, bash selbst zu verwenden:

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

6
r2evans

Aktualisieren

Microsoft hat dies angesprochen. Hintergrund-/Daemon-Prozesse können jetzt weiter ausgeführt werden, auch nachdem bash.exe (oder ein anderer WSL-Startprozess) geschlossen wurde. Eine neuere Version von Win10 (Frühjahr 2018 für öffentliche Veröffentlichungen, Build 17046 oder höher) ist erforderlich.

Das Folgende wird für die Nachwelt aufbewahrt.


Leider/absurderweise gibt es keine Möglichkeit, dies zu tun. Microsoft hat entschieden, dass WSL (Windows Subsystem for Linux) nur ausgeführt wird, wenn ein bash.exe-Prozess geöffnet ist. Schließen Sie das letzte (oder möglicherweise sogar das letzte Fenster ; ich bin mir nicht sicher, ob es toleriert wird, kopflos ausgeführt zu werden), und die WSL wird heruntergefahren, wodurch alle Prozesse abgebrochen werden.

Die Rechtfertigung dafür war "Ressourcen schonen", was auf verschiedenen Ebenen absurd ist, aber vor allem, weil mein Computer diese Ressourcen hat und sie zur Verwendung da sind! Wenn ein Prozess ausgeführt werden soll, sollte er ausgeführt werden. Wenn ich nicht will, dass es läuft, kann ich es töten. Für etwas, das ausdrücklich als Entwicklertool gedacht ist, hat man manchmal den Eindruck, dass WSL nur als Spielzeug verwendet werden kann und den Benutzern nicht vertraut werden kann, was sie tun.

Wie auch immer, wenn Sie dies korrigieren möchten, stimmen Sie für . Aktivieren Sie möglicherweise Cron-Jobs, Daemons und Hintergrundaufgaben auf der UserVoice-Seite . Es ist derzeit die am zweithäufigsten gewählte Anfrage und "im Rückstand".

12
CBHacking

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

Aber es ist möglich, dass es mit einigem Aufwand wie ein Hintergrundprozess "erscheint". Ich wollte diese Funktionalität selbst so ziemlich, dass ich nach ein paar Stunden eine beschissene, aber funktionierende Lösung fand.

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

Linux-Seite, um Daemons zu aktivieren, können Sie Ihr eigenes rudimentäres Startsystem haben, das beispielsweise .bashrc missbraucht.

Der Prozess wird hier in diesem Dokument beschrieben, das ich geschrieben habe https://emil.fi/bashwin . Ich habe keine Aufgabenüberwachung implementiert, aber die Erweiterung dürfte recht einfach sein.

2
Emil

Haben Sie versucht diese Lösung?

Es verwendet einen WSH-Helfer, um versteckte Anwendungen zu starten.

Dann können Sie in Tak Scheduler einfach eine neue Aufgabe erstellen, um den Befehl beim Anmelden zu starten. So etwas wie wscript <path to runHidden.vbs> bash.exe -c "python script.py"

1
Magnus

Ich weiß nicht, wie gut Windows Service Manager (SrvMan) von http://tools.sysprogs.org/srvman/ für Sie funktionieren würde, aber es hat bei mir für andere programme geklappt. Tatsächlich habe ich versucht, die "bash.exe" als Dienst auszuführen, um zu prüfen, ob sie funktionieren würde, und ich schätze, ich muss ein bisschen mehr herumspielen, damit LAMP tatsächlich im Hintergrund funktioniert.

0