20

Is there a way to prevent Windows from going into sleep mode while running a program on the command line or with cygwin? Ideally, I'm hoping for something that could be used like:

nosleep myscript.sh

Background

Sometimes I start up long-running jobs like a manual backup or large file transfers and I've found that Windows often goes to sleep before these finish. I'd like to be able to start up the command and prevent sleep mode while the command is running, but have it automatically work again once the command has completed.

quack quixote
  • 43,504
Mr Fooz
  • 3,491

5 Answers5

19

You may use powercfg in a script to change the time the PC waits until it goes to sleep:

Never go to standby:

powercfg -change -standby-timeout-ac 0

Go to standby in 15 minutes:

powercfg -change -standby-timeout-ac 15
Gareth
  • 19,080
harrymc
  • 498,455
8

Here's a bash script that I whipped up based on harrymc's response.

#!/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

phuclv
  • 30,396
  • 15
  • 136
  • 260
Mr Fooz
  • 3,491
7

There is now such a nosleep command in Cygwin. Just install the nosleep package and run as

nosleep myscript.sh

Written by Andrew E. Schulman in 2011. See https://cygwin.com/ml/cygwin/2011-09/msg00151.html

The source on Launchpad. It uses SetThreadExecutionState() (like Insomnia already mentioned), doesn't create a separate power scheme.

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>.

Note that it prevents the system from automatically going to sleep on idle, not the system from going to sleep if requested by a user (like when closing a laptop lid).

sch
  • 367
3

Suggestion from this answer by @LorenzCK on a related question:

Use Presenting Mode from Windows Mobility Center (if available)

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

Check with powercfg -requests in the command prompt. Should output:

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

Upside is it gets cleared on shutdown or restart. Now you don't have to worry about storing and restoring the original power settings

It also prevents monitors going to sleep but you can make that happen with a command in your script. Simple but third-party solutions: NirCmd nircmd monitor off or AutoHotkey SendMessage, 0x112, 0xF170, 2,, Program Manager The built-in powercfg /requestsoverride process PresentationSettings.exe display will not work though.

Leeroy
  • 245
2

Insomnia prevent your windows to go to sleep but it's not a command line tools, so your script with the harrymc commands are better solutions

fluxtendu
  • 7,219