evitar dormir en guiones

12

¿Hay alguna manera de evitar que Windows entre en modo de suspensión mientras ejecuta un programa en la línea de comando o con cygwin? Idealmente, espero algo que pueda usarse como:

nosleep myscript.sh

Antecedentes

A veces inicio trabajos de larga duración, como una copia de seguridad manual o transferencias de archivos grandes, y he descubierto que Windows a menudo se duerme antes de que finalicen. Me gustaría poder iniciar el comando y evitar el modo de suspensión mientras se ejecuta el comando, pero que vuelva a funcionar automáticamente una vez que el comando se haya completado.

Señor fooz
fuente

Respuestas:

14

Puede usar powercfgun script para cambiar el tiempo que la PC espera hasta que se va a dormir:

Nunca vaya al modo de espera:

powercfg -change -standby-timeout-ac 0

Vaya al modo de espera en 15 minutos:

powercfg -change -standby-timeout-ac 15
harrymc
fuente
Gracias. powercfg más un poco de magia bash es justo lo que necesitaba.
Mr Fooz
Desafortunadamente, esto borra la configuración anterior y debe restaurarla manualmente.
Leeroy
8

Aquí hay un script bash que preparé en base a la respuesta de 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
Señor fooz
fuente
En Cygwin, tuve que eliminar las comillas: de "$*"a $*. De lo contrario, obtuve lo siguiente al dar más de un argumento (por ejemplo $nosleep sleep 1:/usr/bin/nosleep: line 31: sleep 1 command not found
Nippey
1
@Nippey, eso debería ser "$@". "$*"está mal porque concatena todos los argumentos, mientras que $*está mal, ya que divide los argumentos $IFSy elimina los vacíos.
sch
Esto asegura claramente que el esquema de energía se restablezca, incluso si sucede Ctrl-C, pero lo que sería aún mejor sería simplemente crear una solicitud de energía que mantenga la computadora despierta durante la secuencia de comandos, sin cambiar permanentemente ninguna configuración. Pero parece que no hay una manera limpia y fácil de hacerlo, por lo que administrar el estado lo es. Sin embargo, un reproductor multimedia oculto que reproduce silencio sería una manera sucia pero fácil. En AutoHotkey, incluso podría usar un sonido predeterminado de Windows (yay, script portátil). Loop { SoundPlay, %A_WinDir%\Media\ding.wav }Sin waitargumento.
Leeroy
2

Ahora hay tal nosleepcomando en Cygwin. Simplemente instale el nosleeppaquete y ejecútelo como

nosleep myscript.sh

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

La fuente en Launchpad . Utiliza SetThreadExecutionState()(como Insomnia ya mencionado), no crea un esquema de energía 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]>.

Tenga en cuenta que evita que el sistema se suspenda automáticamente en inactivo, no que el sistema se suspenda si un usuario lo solicita (como al cerrar la tapa de una computadora portátil).

sch
fuente
2

Sugerencia de esta respuesta de @LorenzCK sobre una pregunta relacionada:

Usar el modo de presentación del Centro de movilidad de Windows (si está disponible)

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

Verifique powercfg -requestsen el símbolo del sistema. Debería dar salida:

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

Lo positivo es que se borra al apagar o reiniciar. Ahora no tiene que preocuparse por almacenar y restaurar la configuración de energía original 👍

También evita que los monitores se apaguen, pero puede hacer que eso suceda con un comando en su script. Soluciones simples pero de terceros: NirCmd nircmd monitor off o AutoHotkey . Sin embargo, el SendMessage, 0x112, 0xF170, 2,, Program Manager incorporado powercfg /requestsoverride process PresentationSettings.exe displayno funcionará.

Leeroy
fuente
1

El insomnio evita que sus ventanas se apaguen, pero no es una herramienta de línea de comandos, por lo que su script con los comandos harrymc son mejores soluciones

fluxtendu
fuente