アップデート

アップデート

Windows 10 で何かをプログラミングするときは通常 Linux サブシステムを使用するため、すべてのパスは に相対的です~。プロセスを強制終了するまでバックグラウンドで永久に実行される Python スクリプトがあります。ターミナルを開かずに Windows 10 bash でこれを実行するにはどうすればよいですか?

私が試したこと:

  • bash -c "python3 script.py実行から。
  • nohup python3 -u script.pyその後、ターミナルを閉じます。
  • setsid python3 script.pyその後、ターミナルを閉じます。

どれも機能しませんでした。これを行う方法はありますか? または、毎回切り替えることなく、W10 と bash からスクリプトを実行する場合に機能するようにパスを変更する方法はありますか?

答え1

WSL に最近追加された機能により、wsl コマンドを [実行] または [スタート] メニューから直接起動できるようになりました。コマンドにアンパサンドを追加できます (通常のシェルの動作)。これにより、瞬間的なbashターミナルが表示され、すぐに消えますが、コマンドは続行されます。

例、スタート » 実行:

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

Windows のタスク マネージャーにアクセスすると、SleepまたはPython2コマンドが 20 秒間実行され、その後自動的にクリアされることが表示されます。

私が発見したことの 1 つは、環境変数が利用できないことです。たとえば、DISPLAYWindows の通常の方法で が設定されている場合、 は WSL に渡されません。このため、これらの変数を渡す方法が必要です。コマンドがコマンド ライン引数を介して必要な変数を設定することをサポートしていない場合でも、コマンドbash自体を使用して設定することは可能です。

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

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

注意: 現在、win10_64、バージョン 1709 (OS ビルド 16299.64) を実行しています。

答え2

アップデート

Microsoft はこの問題に対処しました。バックグラウンド/デーモン プロセスは、(または他の WSL ランチャー プロセス) が閉じられた後でも実行を継続できるようになりましたbash.exe。Win10 の最新ビルド (パブリック リリースの場合は 2018 年春、ビルド 17046 以上) が必要です。

以下は後世のために保存されます。


悲しいことに、これを実行する方法はありません。Microsoft は、その無限の知恵により、WSL (Windows Subsystem for Linux) はプロセスがbash.exe開いている間のみ実行されると決定しました。最後のプロセスを閉じます (または最後のプロセスを閉じることもできます)。; ヘッドレスでの実行に耐えられるかどうかはわかりません)、WSL がシャットダウンし、すべてのプロセスが強制終了されます。

この正当化は「リソースを節約するため」でしたが、これはさまざまなレベルで不合理ですが、最も顕著なのは、私のコンピューターにはそれらのリソースがあり、それらは使用するために存在しているからです。プロセスを実行したい場合は実行する必要があります。実行したくない場合は、強制終了できます。開発者ツールとして明確に意図されているものとして、WSL はおもちゃとしてしか使用できず、ユーザーが何をしているのかを知ることができないと感じることがあります。

とにかく、これを修正したい場合は、投票してくださいcronジョブ、デーモン、バックグラウンドタスクを有効にすることを検討するの上UserVoiceページこれは現在、2番目に投票数が多いリクエストであり、「バックログ」にあります。

答え3

はい、現時点では「不可能」です。

しかし、ちょっとしたトリックを使えば、バックグラウンド プロセスのように「見せる」ことは可能です。私自身、この機能がどうしても欲しかったので、数時間後には、粗末ながらも機能する解決策を思いつきました。

主なポイントは、VBScript を使用して WSL Bash を起動する目に見えないシェルを作成することです。その後、起動時にそのスクリプトを実行できます。何らかの奇妙な理由で、適切なタスク スケジューリングが機能しませんでした。

Linux 側でデーモンを有効にするには、たとえば .bashrc を悪用する独自の基本的な起動システムを持つことができます。

このプロセスは私が書いたこの文書に詳しく書かれていますhttps://emil.fi/bashwinタスク監視は実装していませんが、拡張するのはかなり簡単なはずです。

答え4

時間がかかりましたが、非常に複雑な方法を見つけました (バッチ ファイルから)。

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

その機能とその理由を以下に説明します。

  • `start`: バッチファイルウィンドウを消す
  • `bash -c`: bashコマンドを実行できます
  • `DISPLAY=:0`: Xサーバを設定します
  • `[command]`: コマンド (`[command && [command]`)
  • `&`: 次のコマンドをその後に実行します始まるそして、終わり
  • `sleep 0.5`: プロセスが開始されたことを確認する
  • `&&`: 次のコマンドを、終わりそして、それが始まる
  • `kill -n 9 $$`: bashシェルを終了してグラフィカルアプリケーションのみにします

注:DISPLAY=:0は x-server に設定します:0。(例) に変更するには:1DISPLAY=:1などを実行します。

注:startバッチスクリプトからの場合のみ必要です。ターミナルからの場合は必要ありません。

注:sleepアプリケーションごとに異なる設定が必要です。省略する必要がある場合もあります。

関連情報