запобігти сну в сценаріях


13

Чи є спосіб запобігти переходу Windows у сплячий режим під час запуску програми в командному рядку або за допомогою cygwin? В ідеалі я сподіваюся на те, що можна було б використовувати:

nosleep myscript.sh

Фон

Іноді я запускаю тривалі завдання, як-от ручне резервне копіювання чи великі передачі файлів, і я виявив, що Windows часто засинає перед цим. Я хотів би мати змогу запустити команду та запобігти режиму сну під час виконання команди, але автоматично повторити її роботу, коли команда буде виконана.

Відповіді:


14

Ви можете використовувати powercfgв сценарії, щоб змінити час очікування ПК, поки він перейде до сну:

Ніколи не переходьте в режим очікування:

powercfg -change -standby-timeout-ac 0

Перейдіть в режим очікування через 15 хвилин:

powercfg -change -standby-timeout-ac 15

Дякую. powercfg плюс трохи баш-магії - це саме те, що мені було потрібно.
Містер Фооз

На жаль, це видаляє попередні налаштування, і вам доведеться відновити його вручну.
Лірой

8

Ось баш-сценарій, який я розіграв на основі відповіді Гаррімка.

#!/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

На Cygwin мені довелося видалити цитати: From "$*"to $*. Інакше я отримав наступне, коли $nosleep sleep 1/usr/bin/nosleep: line 31: sleep 1 command not found
наводив

1
@Nippey, це насправді повинно бути "$@". "$*"помиляється, оскільки поєднує всі аргументи, а $*помиляється, оскільки розбиває аргументи $IFSта видаляє порожні.
sch

Це акуратно гарантує відновлення схеми живлення, навіть якщо Ctrl-C трапляється, але що було б ще акуратніше було б просто створити запит на живлення, що підтримує комп'ютер неспаним протягом тривалості сценарію, без постійних змін будь-яких налаштувань. Але схоже, що немає жодного чистого, простого способу зробити це, таким чином керуючи державою. Однак прихований медіаплеєр, який грає в тиші, був би брудним, але простим способом. В AutoHotkey я навіть міг піти від використання звуку Windows за замовчуванням (так, портативний сценарій). Loop { SoundPlay, %A_WinDir%\Media\ding.wav }, без waitаргументів.
Лірой

2

Зараз nosleepу Cygwin є така команда. Просто встановіть nosleepпакет і запустіть як

nosleep myscript.sh

Автор Ендрю Е. Шульман у 2011 р. Див. Https://cygwin.com/ml/cygwin/2011-09/msg00151.html

Джерело на Launchpad . Він використовує SetThreadExecutionState()(як Insomnia вже згадується), не створює окремої схеми живлення.

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

Зауважте, що це заважає системі автоматично переходити до сну в режимі очікування, а не система лягати спати, якщо цього вимагає користувач (наприклад, при закритті кришки ноутбука).


2

Пропозиція з цієї відповіді від @LorenzCK на пов'язане питання:

Використовуйте режим представлення з Центру мобільності Windows (за наявності)

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

Зверніться powercfg -requestsдо командного рядка. Потрібно вивести:

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

Вгору це очищається при відключенні або перезапуску. Тепер вам не потрібно турбуватися про збереження та відновлення початкових параметрів живлення 👍

Це також заважає моніторам спати, але ви можете зробити це за допомогою команди у вашому сценарії. Прості, але сторонні рішення: NirCmd nircmd monitor off або AutoHotkey SendMessage, 0x112, 0xF170, 2,, Program Manager Вбудований модульpowercfg /requestsoverride process PresentationSettings.exe display не працюватиме.


1

Безсоння заважає вашим вікнам спати, але це не інструменти командного рядка, тому ваш сценарій із командами harrymc - це кращі рішення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.