web-dev-qa-db-ja.com

ターミナルを開かずにWindows 10でbashバックグラウンドプロセスを実行する

私は通常、Windows 10で何かをプログラミングしているときにLinuxサブシステムを使用しているため、すべてのパスは~を基準にしています。 pythonスクリプトを実行して、プロセスを終了するまでバックグラウンドで永久に実行します。Windows10のbashでターミナルを開かずに実行するにはどうすればよいですか?

私が試したこと:

  • Runからのbash -c "python3 script.py
  • Nohup python3 -u script.py次に端末を閉じます。
  • setsid python3 script.py次に端末を閉じます。

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

13
Ash

WSLへの最近の追加により、「実行」または「スタート」メニューから直接wslコマンドを開始できます。コマンドにアンパサンドを追加できます(通常のシェルの動作)。その結果、瞬間的なbash端子が表示されなくなりますが、コマンドは続行されます。

Start"Run内の例:

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

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

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

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

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

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

7
r2evans

更新

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

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


残念ながら、とんでもなく、これを行う方法はありません。 Microsoftは、その無限の知恵により、bash.exeプロセスを開いている間のみWSL(LinuxのWindowsサブシステム)を実行することを決定しました。最後のウィンドウを閉じる(または、最後のウィンドウを閉じることもできます。ヘッドレスでの実行が許容されるかどうかはわかりません)、WSLがシャットダウンします。そのプロセスのすべてを殺します。

これの正当化は「リソースを節約すること」でした。これはいくつかの異なるレベルで不合理ですが、最も明白なのは、私のコンピューターにはそれらのリソースがあり、それらが使用されるためです!プロセスを実行したい場合は、実行する必要があります。実行したくない場合は、殺すことができます。開発者ツールとして明示的に意図されたものの場合、WSLは遊び道具としてのみ使用可能であり、そのユーザーは自分が何をしているかを知ることが信頼できないと感じることがあります。

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

13
CBHacking

それは私に永遠にかかりましたが、それを行う愚かな複雑な方法を見つけました(バッチファイルから):

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

以下に、その機能とその理由の内訳を示します。

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

注:DISPLAY=:0は、:0のxサーバーに設定します。 (例):1に変更するには、DISPLAY=:1などを実行します。

注:startは、バッチスクリプトからの場合にのみ必要です。端末からの場合、これは必要ありません

2
Electroboss

this 解決策を試しましたか?

WSHヘルパーを使用して、非表示のアプリケーションを起動します。

次に、Tak Schedulerで新しいタスクを作成して、ログイン時にコマンドを起動します。何かのようなもの wscript <path to runHidden.vbs> bash.exe -c "python script.py"

2
Magnus

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

しかし、いくつかのトリックを伴うバックグラウンドプロセスのように「表示」することは可能です。私はこの機能を自分でかなり悪いものにしたかったので、数時間後、私は気の利いたが機能する解決策を思いつきました。

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

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

このプロセスの詳細は、私が書いたこのドキュメント https://emil.fi/bashwin にあります。タスクモニタリングは実装しませんでしたが、拡張するのはかなり簡単です。

2
Emil

http://tools.sysprogs.org/srvman/ のWindowsサービスマネージャー(SrvMan)がどのように機能するかわかりませんが、他のプログラムでは機能します。実際、「bash.exe」をサービスとして実行して動作するかどうかを確認しましたが、LAMPをバックグラウンドで実際に動作させるには、もう少し工夫する必要があると思います。

0