uniemożliwić sen w skryptach

13

Czy istnieje sposób, aby zapobiec przejściu systemu Windows w tryb uśpienia podczas uruchamiania programu w wierszu polecenia lub w programie cygwin? Idealnie, mam nadzieję na coś, co mogłoby być użyte, jak:

nosleep myscript.sh

tło

Czasami uruchamiam długotrwałe zadania, takie jak ręczne tworzenie kopii zapasowych lub przesyłanie dużych plików, i zauważyłem, że system Windows często przechodzi w tryb uśpienia przed ich zakończeniem. Chciałbym móc uruchomić polecenie i zapobiec trybowi uśpienia, gdy polecenie jest uruchomione, ale pozwól mu automatycznie działać ponownie po zakończeniu polecenia.

Pan Fooz
źródło

Odpowiedzi:

14

Możesz użyć powercfgskryptu, aby zmienić czas oczekiwania komputera na przejście w tryb uśpienia:

Nigdy nie przechodź w tryb gotowości:

powercfg -change -standby-timeout-ac 0

Przejdź do trybu gotowości za 15 minut:

powercfg -change -standby-timeout-ac 15
harrymc
źródło
Dzięki. powercfg i trochę magii bash to tylko to, czego potrzebowałem.
Pan Fooz
Niestety wymazuje to poprzednie ustawienie i musisz je przywrócić ręcznie.
Leeroy,
8

Oto skrypt bash, który opracowałem na podstawie odpowiedzi Harrymca.

#!/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
Pan Fooz
źródło
W Cygwin musiałem usunąć cytaty: Od "$*"do $*. W przeciwnym razie dostałem następujące, gdy $nosleep sleep 1/usr/bin/nosleep: line 31: sleep 1 command not found
podawałem
1
@Nippey, tak powinno być "$@". "$*"jest błędna, ponieważ łączy wszystkie argumenty, podczas gdy $*jest błędna, ponieważ dzieli argumenty $IFSi usuwa puste.
sch
To starannie zapewnia przywrócenie schematu zasilania, nawet jeśli Ctrl-C się zdarzy, ale jeszcze fajniejsze byłoby po prostu utworzenie żądania zasilania utrzymującego komputer w stanie czuwania przez czas trwania skryptu, bez trwałej zmiany jakichkolwiek ustawień. Ale wygląda na to, że nie ma na to żadnego prostego, łatwego sposobu, więc zarządzanie stanem jest. Jednak ukryty odtwarzacz multimedialny odtwarzający ciszę byłby brudnym, ale łatwym sposobem. W AutoHotkey mogłem nawet uniknąć domyślnego dźwięku systemu Windows (tak, przenośny skrypt). Loop { SoundPlay, %A_WinDir%\Media\ding.wav }, bez waitargumentów.
Leeroy,
2

W nosleepCygwin jest teraz takie polecenie. Wystarczy zainstalować nosleeppakiet i uruchomić jako

nosleep myscript.sh

Napisane przez Andrew E. Schulmana w 2011 roku. Patrz https://cygwin.com/ml/cygwin/2011-09/msg00151.html

Źródło na Launchpad . Wykorzystuje SetThreadExecutionState()(jak wspomniano już bezsenność), nie tworzy osobnego schematu zasilania.

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

Pamiętaj, że zapobiega to automatycznemu przejściu systemu w stan bezczynności, a nie przejściu w tryb uśpienia na żądanie użytkownika (na przykład podczas zamykania pokrywy laptopa).

sch
źródło
2

Sugestia tej odpowiedzi @LorenzCK na powiązane pytanie:

Użyj trybu prezentacji z Windows Mobility Center (jeśli jest dostępny)

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

Sprawdź za pomocą powercfg -requestsw wierszu polecenia. Powinien generować:

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

Zaletą jest to, że jest usuwane po wyłączeniu lub ponownym uruchomieniu. Teraz nie musisz się martwić o przechowywanie i przywracanie oryginalnych ustawień zasilania 👍

Zapobiega również zasypianiu monitorów, ale możesz to zrobić za pomocą polecenia w skrypcie. Proste, ale rozwiązania innych firm: NirCmd nircmd monitor off lub AutoHotkey SendMessage, 0x112, 0xF170, 2,, Program Manager Wbudowane powercfg /requestsoverride process PresentationSettings.exe displaynie będzie jednak działać.

Leeroy
źródło
1

Bezsenność zapobiega zasypianiu systemu Windows, ale nie jest to narzędzie wiersza polecenia, więc skrypt z poleceniami harrymc jest lepszym rozwiązaniem

fluxtendu
źródło