wsl2で長時間かかる処理をしているのですがwindows11のスリープが有効になってしまいます。
ただ省エネの観点からスリープは無効にしたくないですしwsl2上で何も動かしていない場合はスリープさせたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
回答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総合スコア86569
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
総合スコア4164
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
2026/03/04 05:19
2026/03/09 06:04