impedir o sono em scripts

12

Existe uma maneira de impedir que o Windows entre no modo de suspensão enquanto executa um programa na linha de comando ou com o cygwin? Idealmente, espero algo que possa ser usado como:

nosleep myscript.sh

fundo

Às vezes, inicio trabalhos de longa execução, como backup manual ou grandes transferências de arquivos, e descobri que o Windows geralmente entra em suspensão antes que eles terminem. Gostaria de poder iniciar o comando e impedir o modo de suspensão enquanto o comando estiver em execução, mas fazê-lo funcionar automaticamente novamente assim que o comando for concluído.

Mr Fooz
fonte

Respostas:

14

Você pode usar powercfgem um script para alterar o tempo que o PC espera até que ele entre no modo de suspensão:

Nunca vá para o modo de espera:

powercfg -change -standby-timeout-ac 0

Vá para o modo de espera em 15 minutos:

powercfg -change -standby-timeout-ac 15
harrymc
fonte
Obrigado. powercfg mais alguma mágica do bash são exatamente o que eu precisava.
Mr Fooz
Infelizmente, isso apaga a configuração anterior e você deve restaurá-la manualmente.
Leeroy
8

Aqui está um script bash que eu criei com base na resposta do harrymc.

#!/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
Mr Fooz
fonte
No Cygwin, tive que remover as aspas: De "$*"para $*. Caso contrário, obtive o seguinte ao apresentar mais de um argumento (por exemplo $nosleep sleep 1:/usr/bin/nosleep: line 31: sleep 1 command not found
Nippey
1
@ Nippey, isso realmente deveria ser "$@". "$*"está errado porque concatena todos os argumentos, enquanto $*está errado, pois divide os argumentos $IFSe remove os vazios.
SCH
Isso garante que o esquema de energia seja restaurado, mesmo que Ctrl-C aconteça, mas o que seria ainda melhor seria apenas criar uma solicitação de energia, mantendo o computador acordado durante o script, sem alterar permanentemente as configurações. Mas parece que não há uma maneira fácil e limpa de fazer isso, portanto, gerenciar o estado é. No entanto, um media player oculto tocando silêncio seria uma maneira suja, mas fácil. No AutoHotkey, eu até conseguia usar um som padrão do Windows (sim, script portátil). Loop { SoundPlay, %A_WinDir%\Media\ding.wav }, sem waitargumento.
Leeroy
2

Agora existe um nosleepcomando desse tipo em Cygwin. Basta instalar o nosleeppacote e executar como

nosleep myscript.sh

Escrito por Andrew E. Schulman em 2011. Consulte https://cygwin.com/ml/cygwin/2011-09/msg00151.html

A fonte no Launchpad . Ele usa SetThreadExecutionState()(como Insomnia já mencionado), não cria um esquema de energia separado.

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 <[email protected]>.

Observe que ele impede que o sistema entre automaticamente no modo ocioso, e não no sistema, se solicitado por um usuário (como ao fechar a tampa do laptop).

sch
fonte
2

Sugestão desta resposta por @LorenzCK em uma pergunta relacionada:

Use o Modo de apresentação no Windows Mobility Center (se disponível)

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

Verifique com powercfg -requestsno prompt de comando. Saída deve:

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

De cabeça para baixo, ele é limpo ao desligar ou reiniciar. Agora você não precisa se preocupar em armazenar e restaurar as configurações de energia originais 👍

Isso também impede que os monitores entrem no modo de espera, mas você pode fazer isso acontecer com um comando no seu script. Soluções simples, mas de terceiros: NirCmd nircmd monitor off ou AutoHotkey SendMessage, 0x112, 0xF170, 2,, Program Manager O built-in powercfg /requestsoverride process PresentationSettings.exe displaynão funcionará.

Leeroy
fonte
1

A insônia impede que o Windows durma, mas não é uma ferramenta de linha de comando; portanto, seu script com os comandos harrymc é uma solução melhor

fluxtendu
fonte