prevenire il sonno negli script


12

C'è un modo per impedire a Windows di entrare in modalità di sospensione durante l'esecuzione di un programma dalla riga di comando o con cygwin? Idealmente, spero in qualcosa che possa essere usato come:

nosleep myscript.sh

sfondo

A volte avvio processi di lunga durata come un backup manuale o trasferimenti di file di grandi dimensioni e ho scoperto che Windows va spesso in sospensione prima di finire. Mi piacerebbe essere in grado di avviare il comando e impedire la modalità di sospensione mentre il comando è in esecuzione, ma farlo funzionare automaticamente una volta completato il comando.

Risposte:


14

È possibile utilizzare powercfgin uno script per modificare il tempo di attesa del PC fino allo spegnimento:

Non andare mai in standby:

powercfg -change -standby-timeout-ac 0

Vai in standby in 15 minuti:

powercfg -change -standby-timeout-ac 15

Grazie. Powercfg e un po 'di magia bash sono proprio ciò di cui avevo bisogno.
Fooz,

Sfortunatamente questo cancella l'impostazione precedente e devi ripristinarla manualmente.
Leeroy,

8

Ecco uno script bash che ho preparato in base alla risposta di 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

Su Cygwin, ho dovuto rimuovere le virgolette: Da "$*"a $*. Altrimenti ho ottenuto quanto segue quando ho dato più di un argomento (ad esempio $nosleep sleep 1:/usr/bin/nosleep: line 31: sleep 1 command not found
Nippey

1
@Nippey, in realtà dovrebbe essere "$@". "$*"è sbagliato perché concatena tutti gli argomenti, mentre $*è sbagliato in quanto divide gli argomenti $IFSe rimuove quelli vuoti.
sch

Ciò assicura che venga ripristinata la combinazione di risparmio energia, anche se si verifica Ctrl-C, ma ciò che sarebbe ancora più ordinato sarebbe semplicemente creare una richiesta di alimentazione mantenendo il computer sveglio per la durata dello script, senza modificare in modo permanente alcuna impostazione. Ma sembra che non ci sia un modo semplice e pulito per farlo, quindi gestendo lo stato lo è. Tuttavia, un lettore multimediale nascosto che riproduca il silenzio sarebbe un modo sporco ma semplice. In AutoHotkey potrei persino cavarmela usando un suono predefinito di Windows (yay, script portatile). Loop { SoundPlay, %A_WinDir%\Media\ding.wav }, senza waitdiscussione.
Leeroy,

2

Ora c'è un tale nosleepcomando in Cygwin. Basta installare il nosleeppacchetto ed eseguire come

nosleep myscript.sh

Scritto da Andrew E. Schulman nel 2011. Vedi https://cygwin.com/ml/cygwin/2011-09/msg00151.html

La fonte su Launchpad . Usa SetThreadExecutionState()(come già menzionato Insomnia), non crea uno schema di potenza separato.

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

Si noti che impedisce al sistema di andare automaticamente in standby inattivo, non al sistema di andare in sospensione se richiesto da un utente (come quando si chiude il coperchio di un laptop).


2

Suggerimenti di questa risposta di @LorenzCK su una domanda correlata:

Usa la modalità Presentazione da Windows Mobility Center (se disponibile)

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

Verificare con powercfg -requestsnel prompt dei comandi. Dovrebbe produrre:

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

Il lato positivo è che viene cancellato allo spegnimento o al riavvio. Ora non devi preoccuparti di memorizzare e ripristinare le impostazioni di alimentazione originali 👍

Impedisce inoltre ai monitor di andare in stop, ma è possibile farlo accadere con un comando nel proprio script. Soluzioni semplici ma di terze parti: NirCmd nircmd monitor off o AutoHotkey SendMessage, 0x112, 0xF170, 2,, Program Manager Tuttavia, il built-in powercfg /requestsoverride process PresentationSettings.exe displaynon funzionerà.


1

L'insonnia impedisce alle finestre di andare a dormire ma non è uno strumento da riga di comando, quindi i tuoi script con i comandi harrymc sono soluzioni migliori

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.