empêcher le sommeil dans les scripts


12

Existe-t-il un moyen d'empêcher Windows de passer en mode veille lors de l'exécution d'un programme sur la ligne de commande ou avec cygwin? Idéalement, j'espère quelque chose qui pourrait être utilisé comme:

nosleep myscript.sh

Contexte

Parfois, je démarre des travaux de longue durée comme une sauvegarde manuelle ou des transferts de fichiers volumineux et j'ai constaté que Windows se met souvent en veille avant la fin. Je voudrais pouvoir démarrer la commande et empêcher le mode veille pendant l'exécution de la commande, mais la faire fonctionner à nouveau automatiquement une fois la commande terminée.

Réponses:


14

Vous pouvez utiliser powercfgdans un script pour modifier le temps d'attente du PC jusqu'à ce qu'il se mette en veille:

Ne passez jamais en veille:

powercfg -change -standby-timeout-ac 0

Passez en veille en 15 minutes:

powercfg -change -standby-timeout-ac 15

Merci. powercfg et de la magie bash sont exactement ce dont j'avais besoin.
M. Fooz

Malheureusement, cela efface le paramètre précédent et vous devez le restaurer manuellement.
Leeroy

8

Voici un script bash que j'ai préparé en fonction de la réponse 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

Sur Cygwin, j'ai dû supprimer les guillemets: de "$*"à $*. Sinon, j'ai obtenu ce qui suit en donnant plus d'un argument (par exemple $nosleep sleep 1:/usr/bin/nosleep: line 31: sleep 1 command not found
Nippey

1
@Nippey, ça devrait l'être "$@". "$*"est incorrect car il concatène tous les arguments, tandis qu'il $*est incorrect car il divise les arguments $IFSet supprime ceux qui sont vides.
sch

Cela permet de s'assurer que le schéma d'alimentation est restauré, même si Ctrl-C se produit, mais ce qui serait encore plus propre serait de simplement créer une demande d'alimentation en gardant l'ordinateur éveillé pendant la durée du script, sans modifier de façon permanente les paramètres. Mais il semble qu'il n'y ait pas de moyen propre et facile de le faire, alors la gestion de l'état est. Cependant, un lecteur multimédia caché jouant le silence serait un moyen sale mais facile. Dans AutoHotkey, je pouvais même m'en tirer en utilisant un son Windows par défaut (yay, script portable). Loop { SoundPlay, %A_WinDir%\Media\ding.wav }, sans waitargument.
Leeroy

2

Il existe désormais une telle nosleepcommande dans Cygwin. Installez simplement le nosleeppackage et exécutez en tant que

nosleep myscript.sh

Écrit par Andrew E. Schulman en 2011. Voir https://cygwin.com/ml/cygwin/2011-09/msg00151.html

La source sur Launchpad . Il utilise SetThreadExecutionState()(comme Insomnia déjà mentionné), ne crée pas de schéma d'alimentation séparé.

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

Notez qu'il empêche le système de se mettre automatiquement en veille au repos, pas le système de se mettre en veille si un utilisateur le demande (comme lors de la fermeture d'un couvercle d'ordinateur portable).


2

Suggestion de cette réponse de @LorenzCK sur une question connexe:

Utiliser le mode de présentation à partir de Windows Mobility Center (si disponible)

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

Vérifiez avec powercfg -requestsdans l'invite de commande. Devrait produire:

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

L'avantage est qu'il est effacé à l'arrêt ou au redémarrage. Maintenant, vous n'avez plus à vous soucier de stocker et de restaurer les paramètres d'alimentation d'origine 👍

Cela empêche également les moniteurs de se mettre en veille, mais vous pouvez y arriver avec une commande de votre script. Solutions simples mais tierces: NirCmd nircmd monitor off ou AutoHotkey SendMessage, 0x112, 0xF170, 2,, Program Manager Le intégré powercfg /requestsoverride process PresentationSettings.exe displayne fonctionnera pas cependant.


1

L'insomnie empêche vos fenêtres de s'endormir mais ce n'est pas un outil en ligne de commande, donc votre script avec les commandes harrymc sont de meilleures solutions

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.