nosleep command

Andrew Schulman
Mon Sep 12 17:42:00 GMT 2011

I'd like to provide a 'nosleep' command for Cygwin, that will prevent the host from sleeping or
hibernating while a command executes.  I haven't seen anything in Cygwin that currently does this,
but please enlighten me if I'm wrong.

Looking around for how to do this, I see two basic approaches:

(1) Run SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED) to try to convince the computer
not to sleep or hibernate, while the desired command executes.  See for example [1], which does
this.  I haven't tested it yet.  Looking at the documentation of SetThreadExecutionState() [2], it
seems that this approach will keep the computer from sleeping when it's idle, but not when the user
closes a laptop lid or pushes the power button.

(2) Use the powercfg command (or PowerDuplicateScheme(), etc.) to create a temporary power scheme
with sleep and hibernation disabled, then restore the original power scheme after the command has
finished.  See for example [3], which does this (that particular implementation needs work -
powercfg needs different options in Windows XP and earlier).

Which approach do people think is better?  Or is there another, better way?

#2 seems more fragile, in the sense that it will fail to restore the original power scheme if the
parent process is killed before it finishes executing.  By contrast, #1 doesn't have any cleanup to
do at the end, so there's no harm done if the parent process is killed.

#2 will prevent the user from manually putting the computer to sleep or hibernating, but I'm not
sure if that's an advantage.  Users won't necessarily know why their computer won't go to sleep when
they tell it to, or why after a while it starts to work again.  Whether it's worthwhile may depend
on how important it is for the requested command to finish - although that still isn't guaranteed
under #2, since the user can still shut the machine down.

Finally, it seems likely that #1 needs lower privileges than #2, although I'm not sure about that


Problem reports:
Unsubscribe info:

More information about the Cygwin mailing list