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


13

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

私が試したこと:

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

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

回答:


7

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)を実行しています。


13

更新

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

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


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

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

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


「特に、私のコンピューターにはそれらのリソースがあり、使用するためにそこにあるので、非常にうまくいきます」それは本当に...心をboggles
空爆

私は17134をビルドしていますが、bashウィンドウがないとバックグラウンドジョブを実行できません。
ジョンピック

@JohnPick再起動後は自動的に起動しませんが、ウィンドウが閉じている間は実行されたままになります(もちろん、ウィンドウに接続されていない限り)。
CBHacking 2018

@CBHackingより具体的には、Node.jsサーバーをバックグラウンドで起動すると、それはジョブ(jobs)とプロセス(ps aux)の両方になります。fgフォアグラウンドにするために使用できます。しかし、最後のbashウィンドウを閉じて新しいbashウィンドウを開くと、ジョブはなくなり、プロセスはまだ実行中であり、プロセスをフォアグラウンドに移動できません。用語がオフの場合は申し訳ありません。
ジョンピック

全く別の問題だ@JohnPickああ、 -この質問はプロセスについて、ないシェルジョブ管理についてです-私はそれをここにあげる他の場所で尋ねたが、答えは簡単で十分ですされているはずである:下のプロセスを起動するtmuxか、screenサポートに別の端末に再接続します。ネイティブで実行されているLinux(およびその他の* nix)マシンにも同じ制限があります。
CBHacking 2018

2

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

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

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

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

このプロセスの詳細については、https://emil.fi/bashwinで作成したこのドキュメントを参照してください。タスクモニタリングは実装しませんでしたが、拡張するのは非常に簡単です。


2

この解決策を試しましたか?

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

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


2

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

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=:0xサーバーに設定し:0ます。それを(eg)に変更するには:1、次のようにしますDISPLAY=:1

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

注:sleepアプリケーションごとに異なる設定が必要です。あなたはそれを省略する必要があるかもしれません。


0

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


1
これは、Pythonスクリプトをバックグラウンドで実行する方法の問題にどのように対処しますか?
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.