質問するログイン新規登録

Q&A

2回答

539閲覧

wsl2でプログラムを走らせているときにwindowsをスリープさせない方法

a.com

総合スコア921

Windows 11

Windows 11は、Windows 10の後継バージョン。それまでのMetroデザインを廃止し、Fluentデザインを導入しています。スタートメニューの構成やウィンドウのデザインの変更の他、Androidアプリをネイティブに実行できます。

0グッド

3クリップ

投稿2026/02/24 15:46

0

3

wsl2で長時間かかる処理をしているのですがwindows11のスリープが有効になってしまいます。
ただ省エネの観点からスリープは無効にしたくないですしwsl2上で何も動かしていない場合はスリープさせたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

guest

回答2

0

動画再生中などはスリープしないので、そういうAPIがあるはずでAIに聞いてみました。

ユーザー操作や画面の変化なく処理だけ長時間継続する処理があるが、これの実行中にスリープしないようにしたい。プログラムからどういうAPIをどのように呼び出せばいいか?

Win32 APIの SetThreadExecutionState を呼べばいいようです。長い時間処理のプログラムが自作なら冒頭にその処理を入れれば良いです。APIをそのような引数で呼び出したスレッドが終了するとその設定も消えるとのことなので、解除の必要は無いでしょう。

対象が自作プログラムでなく、改変できない実行プログラムだったり、シェルスクリプトでいくつかのコマンドを実行してそのシェルスクリプトが継続している間は抑止したい場合は、「この設定をした上で、該当プログラムやシェルスクリプトを実行してそれがが終了したら、自分も終了する」というラッパープログラムを作るなど工夫が必要です。

と思ったけど、WSL2上のプログラムから直接Win32APIは呼べないか。。。

API呼び出し前提で質問したので上のような回答になりましたが、さらに聞くとWindowsのPowerToysにそういうコマンドがあるようです。WSL2からexeコマンド起動はできますね。
https://learn.microsoft.com/ja-jp/windows/powertoys/awake
いろいろなオプションがありますね。

--use-parent-pid Awake の実行を親プロセスにアタッチします。 親プロセスが終了すると、PowerToys Awake も終了します。

というオプションが使えそうです。これがプロセスの親子関係上でうまくいかないときは、このコマンドを子プロセスで起動して、自分の処理が終わったら間違いなくその子プロセスを終了させるとかですね。

なお、AIに聞いたのと上記MSのページを見ただけで、私はそれ以上の確認をしていません。

投稿2026/02/25 02:19

編集2026/02/25 02:26
otn

総合スコア86569

otn

2026/03/04 05:19

PowerToys.Awake を有効にしてみましたが、タスクトレイから操作で、「OSのスリープ設定はそのままで、いまだけこれからXX時間はスリープさせない(時間経過後はものとスリープ設定に戻る)」という操作ができるので、長時間処理の時間見積もりが「2-3時間で終わる」などとできているなら、この機能を使うと楽ですね。「2-3時間で終わるはずだが、もしかすると10時間かかるかもなので、プログラムの実行状態の把握が必須」とかだと作りこみが要りますが。
a.com

2026/03/09 06:04

返信遅れてすみません。ありがとうございます!ただPowerToys.Awake試した見たのですが、わたしの環境だとコマンドラインから有効にならないです・・・
guest

0

geminiに訊いてみた。

最後にこうあります。

まずは、手元のWSLで powercfg.exe /query と打って、正しくWindows側のコマンドが呼び出せるか試してみてください。

手元ではpowercfg.exeを実行できるので、シェルスクリプトの前後で powercfg.exe を実行することで、実現できるのではないでしょうか。きっと。

以下。




結論から言うと、WSLからWindowsの電源管理をコントロールすることは可能です。

WSLの大きな特徴の一つに「Windowsの実行ファイル(.exe)を直接呼び出せる」という点があります。これを利用して、Windows標準の電源管理コマンドである powercfg.exe をWSLのターミナルから実行します。

以下に、具体的な方法とスクリプトの例をまとめました。


基本的な仕組み

WSL(Linux側)から powercfg.exe を叩くことで、Windows本体の電源設定を書き換えます。

  • スリープを無効にする: powercfg.exe /x -standby-timeout-ac 0 (0は「なし」を意味します)
  • スリープを有効にする(例:15分): powercfg.exe /x -standby-timeout-ac 15

[!IMPORTANT]
実行権限について
電源設定の変更には管理者権限が必要です。WSLを起動しているターミナル(PowerShellやコマンドプロンプト)を「管理者として実行」している必要があります。


処理中だけスリープさせないシェルスクリプト案

以下のようなスクリプトを作成すると、ご希望の挙動を自動化できます。

bash

1#!/bin/bash 2 3# 1. 現在の設定を保存(後で戻すため。例として15分に設定されていたと仮定) 4# ※本来は現在の値を抽出して変数に入れるのが理想ですが、簡易的に固定値で解説します。 5ORIGINAL_TIMEOUT=15 6 7echo "Windowsのスリープを無効化しています..." 8# AC電源使用時のスリープ待機時間を0(なし)に設定 9powercfg.exe /x -standby-timeout-ac 0 10 11# 2. 実行したい重い処理 12echo "処理を開始します..." 13sleep 10 # ここに実際のコマンドを記述(例: python train.py など) 14echo "処理が完了しました。" 15 16# 3. 設定を元に戻す 17echo "Windowsのスリープ設定を元に戻しています(${ORIGINAL_TIMEOUT}分)..." 18powercfg.exe /x -standby-timeout-ac $ORIGINAL_TIMEOUT 19 20echo "すべて完了しました。" 21

注意点とTips

  • ACとDCの違い: 上記の例は -standby-timeout-ac(電源接続時)を操作しています。ノートPCでバッテリー駆動中の設定を変えたい場合は -standby-timeout-dc を使用してください。
  • 現在の設定を確認する: powercfg.exe /query を実行すると現在の全設定が表示されますが、情報量が多いため grep などで絞り込むと使いやすくなります。
  • より安全な運用: 処理が途中でエラー終了(Ctrl+Cなどで中断)した場合、最後の「設定を戻す」処理が走らない可能性があります。より堅牢にするなら、シェルスクリプトの trap 機能を使って、終了時には必ず復元コマンドが動くように組むのがベストです。

まずは、手元のWSLで powercfg.exe /query と打って、正しくWindows側のコマンドが呼び出せるか試してみてください。

投稿2026/02/25 00:31

shiketa

総合スコア4164

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問