スクリプトのスリープを防止する


12

コマンドラインまたはcygwinでプログラムを実行しているときにWindowsがスリープモードになるのを防ぐ方法はありますか?理想的には、次のように使用できるものを期待しています。

nosleep myscript.sh

バックグラウンド

手動バックアップや大容量ファイルの転送など、長時間実行されるジョブを起動することがありますが、これらの処理が完了する前にWindowsがスリープ状態になることがよくあります。コマンドの実行中にコマンドを起動してスリープモードを回避できるようにしたいのですが、コマンドが完了すると自動的に動作するようになります。

回答:


14

powercfgスクリプトで使用して、PCがスリープ状態になるまで待機する時間を変更できます。

スタンバイ状態にしないでください:

powercfg -change -standby-timeout-ac 0

15分でスタンバイ状態になります。

powercfg -change -standby-timeout-ac 15

ありがとう。powercfgといくつかのbashマジックは、まさに必要なものです。
Mr Fooz

残念ながら、これにより以前の設定が消去されるため、手動で復元する必要があります。
リーロイ

8

これが、harrymcの応答に基づいて作成したbashスクリプトです。

#!/usr/bin/bash

# NAME
#   nosleep - prevent sleep and hibernation while running a command
#
# SYNOPSIS
#   nosleep COMMAND [ARG]...

# Make sure the power scheme gets restored, even if Ctrl-C happens
cleanup()
{
  powercfg -setactive $SCHEME_GUID
  powercfg -delete    $TMP_GUID
  return $?
}
trap cleanup SIGINT

# Disable sleep and hibernate timers
export SCHEME_GUID=`powercfg -getactivescheme | gawk '{ print $4 }'`
export TMP_GUID=`powercfg -duplicatescheme $SCHEME_GUID | gawk '{ print $4 }'`
if [[ -z $TMP_GUID ]]; then
    echo "ERROR: could not duplicate the current power scheme"
    exit 254
fi
powercfg -setactive $TMP_GUID
powercfg -changename $TMP_GUID nosleep "temporary scheme for disabling sleep and hibernation"
powercfg -change -standby-timeout-ac 0
powercfg -change -hibernate-timeout-ac 0

# Run the command
"$@"

powercfg -setactive $SCHEME_GUID
powercfg -delete    $TMP_GUID

Cygwinでは、引用符を削除する必要がありました:From "$*"から$*。それ以外の場合、複数の引数を指定すると次のようになります(例$nosleep sleep 1/usr/bin/nosleep: line 31: sleep 1 command not found
-Nippey

1
@Nippey、それは実際にはであるべき"$@"です。"$*"これは、すべての引数を連結するため$*間違っていますが、引数を分割し$IFSて空の引数を削除するため間違っています。
sch

これにより、Ctrl-Cが発生した場合でも電源スキームが確実に復元されますが、さらにすてきなのは、設定を永続的に変更せずに、スクリプトの実行中にコンピューターを起動したままにする電源要求を作成することです。しかし、クリーンで簡単な方法がないため、状態を管理しているようです。ただし、沈黙を再生する非表示のメディアプレーヤーは、汚れているが簡単な方法です。AutoHotkeyでは、デフォルトのWindowsサウンド(いや、ポータブルスクリプト)を使用することさえできました。Loop { SoundPlay, %A_WinDir%\Media\ding.wav }wait引数なし。
リーロイ

2

現在nosleep、Cygwinにはそのようなコマンドがあります。nosleepパッケージをインストールして実行するだけです

nosleep myscript.sh

Andrew E. Schulmanが2011年に執筆。https: //cygwin.com/ml/cygwin/2011-09/msg00151.htmlを参照

Launchpadのソース。これは、使用していますSetThreadExecutionState()(不眠症は、すでに述べたように)、独立した電源設定を作成しません。

Usage: nosleep [OPTION...] command [args]
Run a command while inhibiting computer sleep or hibernation.

  -a, --awaymode             Force away mode instead of sleep mode
  -d, --display              Keep the display on
  -i, --ifacpower            Following options only apply if AC power is on
  -?, --help                 give this help list
  --usage                give a short usage message
  -V, --version              print program version

Report bugs to the Cygwin mailing list <cygwin@cygwin.com>.

これは、システムがユーザーの要求(ラップトップの蓋を閉めるときなど)でスリープするのではなく、アイドル時に自動的にスリープするのを防ぐことに注意してください。


2

関連する質問に関する@LorenzCKによるこの回答からの提案:

Windowsモビリティセンターのプレゼンティングモードを使用する(利用可能な場合)

%WINDIR%\System32\PresentationSettings.exe "/start"

powercfg -requestsコマンドプロンプトで確認します。出力する必要があります:

DISPLAY:
[PROCESS] \Device\HarddiskVolume2\Windows\System32\PresentationSettings.exe
SYSTEM:
[PROCESS] \Device\HarddiskVolume2\Windows\System32\PresentationSettings.exe

利点は、シャットダウンまたは再起動時にクリアされることです。これで、元の電源設定の保存と復元について心配する必要はありません👍

また、モニターがスリープ状態になるのを防ぎますが、スクリプト内のコマンドでそれを実現できます。シンプルだがサードパーティのソリューション:NirCmd nircmd monitor offまたはAutoHotkey SendMessage, 0x112, 0xF170, 2,, Program Manager ビルトインpowercfg /requestsoverride process PresentationSettings.exe displayは動作しません。


1

不眠症はウィンドウがスリープ状態になるのを防ぎますが、コマンドラインツールではないため、harrymcコマンドを使用したスクリプトの方が優れたソリューションです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.