Verhindern Sie den Schlaf in Skripten

13

Gibt es eine Möglichkeit, zu verhindern, dass Windows in den Ruhemodus wechselt, während ein Programm in der Befehlszeile oder mit Cygwin ausgeführt wird? Im Idealfall hoffe ich auf etwas, das verwendet werden kann wie:

nosleep myscript.sh

Hintergrund

Manchmal starte ich Jobs mit langer Laufzeit wie eine manuelle Sicherung oder große Dateiübertragungen und habe festgestellt, dass Windows häufig in den Ruhezustand wechselt, bevor diese abgeschlossen sind. Ich möchte in der Lage sein, den Befehl zu starten und den Ruhemodus zu verhindern, während der Befehl ausgeführt wird, aber er soll nach Abschluss des Befehls automatisch wieder funktionieren.

Herr Fooz
quelle

Antworten:

14

Sie können powercfgin einem Skript die Zeit ändern, die der PC wartet, bis er in den Ruhezustand wechselt:

Gehen Sie niemals in den Standby-Modus:

powercfg -change -standby-timeout-ac 0

In 15 Minuten in den Standby-Modus wechseln:

powercfg -change -standby-timeout-ac 15
harrymc
quelle
Vielen Dank. PowerCFG und etwas Bash-Magie sind genau das, was ich brauchte.
Herr Fooz
Leider wird dadurch die vorherige Einstellung gelöscht, und Sie müssen sie manuell wiederherstellen.
Leeroy
8

Hier ist ein Bash-Skript, das ich basierend auf der Antwort von harrymc erstellt habe.

#!/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
Herr Fooz
quelle
Auf Cygwin musste ich die Anführungszeichen entfernen: Von "$*"bis $*. Ansonsten bekam ich folgendes, wenn ich mehr als ein Argument gab (zB $nosleep sleep 1:/usr/bin/nosleep: line 31: sleep 1 command not found
Nippey
1
@Nippey, das sollte eigentlich sein "$@". "$*"ist falsch, weil es alle Argumente verkettet, während $*es falsch ist, wenn es die Argumente $IFSaufteilt und die leeren entfernt.
sch
Auf diese Weise wird sichergestellt, dass das Stromversorgungsschema wiederhergestellt wird, selbst wenn Strg-C ausgeführt wird. Noch besser wäre es jedoch, nur eine Stromversorgungsanforderung zu erstellen, die den Computer für die Dauer des Skripts wach hält, ohne die Einstellungen dauerhaft zu ändern. Aber es sieht so aus, als gäbe es keinen sauberen und einfachen Weg, dies zu tun. Ein versteckter Mediaplayer, der Stille spielt, wäre jedoch ein schmutziger, aber einfacher Weg. In AutoHotkey konnte ich sogar mit einem Standard-Windows-Sound (yay, portables Skript) davonkommen. Loop { SoundPlay, %A_WinDir%\Media\ding.wav }ohne waitArgument.
Leeroy
2

nosleepIn Cygwin gibt es jetzt einen solchen Befehl. Installieren Sie einfach das nosleepPaket und führen Sie es aus als

nosleep myscript.sh

Geschrieben von Andrew E. Schulman im Jahr 2011. Siehe https://cygwin.com/ml/cygwin/2011-09/msg00151.html

Die Quelle auf dem Launchpad . Es verwendet SetThreadExecutionState()(wie bereits erwähnte Schlaflosigkeit), erstellt kein separates Stromversorgungsschema.

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

Beachten Sie, dass dadurch verhindert wird, dass das System im Leerlauf automatisch in den Ruhezustand wechselt, und nicht, dass das System auf Anforderung eines Benutzers in den Ruhezustand wechselt (z. B. beim Schließen eines Laptopdeckels).

sch
quelle
2

Vorschlag aus dieser Antwort von @LorenzCK zu einer verwandten Frage:

Verwenden Sie den Präsentationsmodus im Windows Mobility Center (falls verfügbar).

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

Überprüfen Sie mit powercfg -requestsin der Eingabeaufforderung. Sollte ausgeben:

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

Der Vorteil ist, dass es beim Herunterfahren oder Neustart gelöscht wird. Jetzt müssen Sie sich nicht mehr um das Speichern und Wiederherstellen der ursprünglichen Energieeinstellungen kümmern 👍

Es verhindert auch, dass Monitore in den Ruhezustand versetzt werden. Sie können dies jedoch mit einem Befehl in Ihrem Skript erreichen. Einfache Lösungen von Drittanbietern : NirCmdnircmd monitor off oder AutoHotkey SendMessage, 0x112, 0xF170, 2,, Program Manager Die integrierte Lösung funktioniertpowercfg /requestsoverride process PresentationSettings.exe display jedoch nicht.

Leeroy
quelle
1

Schlaflosigkeit verhindert, dass Ihre Fenster in den Ruhezustand versetzt werden, es handelt sich jedoch nicht um ein Befehlszeilentool. Daher ist Ihr Skript mit den harrymc-Befehlen eine bessere Lösung

fluxtendu
quelle