mencegah tidur di skrip

12

Apakah ada cara untuk mencegah Windows masuk ke mode tidur saat menjalankan program pada command line atau dengan cygwin? Idealnya, saya berharap sesuatu yang dapat digunakan seperti:

nosleep myscript.sh

Latar Belakang

Kadang-kadang saya memulai pekerjaan yang sudah berjalan lama seperti cadangan manual atau transfer file besar dan saya menemukan bahwa Windows sering tertidur sebelum selesai. Saya ingin dapat memulai perintah dan mencegah mode tidur saat perintah sedang berjalan, tetapi secara otomatis berfungsi lagi setelah perintah selesai.

Tuan Fooz
sumber

Jawaban:

14

Anda dapat menggunakan powercfgskrip untuk mengubah waktu PC menunggu hingga tidur:

Tidak pernah pergi ke siaga:

powercfg -change -standby-timeout-ac 0

Ke standby dalam 15 menit:

powercfg -change -standby-timeout-ac 15
harrymc
sumber
Terima kasih. powercfg plus beberapa bash magic adalah yang saya butuhkan.
Tuan Fooz
Sayangnya ini menghapus pengaturan sebelumnya, dan Anda harus mengembalikannya secara manual.
Leeroy
8

Inilah skrip bash yang saya buat berdasarkan respons 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
Tuan Fooz
sumber
Di Cygwin, saya harus menghapus tanda kutip: Dari "$*"ke $*. Kalau tidak, saya mendapat yang berikut ketika memberikan lebih dari satu argumen (misalnya $nosleep sleep 1:/usr/bin/nosleep: line 31: sleep 1 command not found
Nippey
1
@Nippey, itu seharusnya benar "$@". "$*"salah karena menggabungkan semua argumen, sedangkan $*salah karena membagi argumen $IFSdan menghilangkan yang kosong.
sch
Ini dengan rapi memastikan skema daya pulih, bahkan jika Ctrl-C terjadi, tetapi apa yang akan lebih rapi adalah dengan membuat permintaan daya agar komputer tetap terjaga selama skrip, tanpa mengubah pengaturan apa pun secara permanen. Tapi sepertinya tidak ada cara yang bersih dan mudah untuk melakukan itu jadi mengelola keadaan itu. Namun, pemutar media tersembunyi yang memainkan keheningan akan menjadi cara yang kotor tetapi mudah. Di AutoHotkey saya bahkan bisa menggunakan suara Windows default (yay, portable script). Loop { SoundPlay, %A_WinDir%\Media\ding.wav }, tanpa waitargumen.
Leeroy
2

Sekarang ada nosleepperintah seperti itu di Cygwin. Cukup instal nosleeppaket dan jalankan sebagai

nosleep myscript.sh

Ditulis oleh Andrew E. Schulman pada 2011. Lihat https://cygwin.com/ml/cygwin/2011-09/msg00151.html

Sumber di Launchpad . Ini menggunakan SetThreadExecutionState()(seperti Insomnia telah disebutkan), tidak membuat skema kekuatan terpisah.

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

Perhatikan bahwa ini mencegah sistem dari tidur secara otomatis pada saat idle, bukan sistem dari tidur jika diminta oleh pengguna (seperti ketika menutup penutup laptop).

sch
sumber
2

Saran dari jawaban ini oleh @LorenzCK pada pertanyaan terkait:

Gunakan Mode Presentasi dari Windows Mobility Center (jika tersedia)

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

Periksa dengan powercfg -requestsdi command prompt. Haruskah output:

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

Terbalik itu akan dibersihkan pada saat shutdown atau restart. Sekarang Anda tidak perlu khawatir tentang menyimpan dan mengembalikan pengaturan daya asli 👍

Ini juga mencegah monitor tidur tetapi Anda bisa mewujudkannya dengan perintah di skrip Anda. Solusi sederhana tetapi pihak ketiga: NirCmd nircmd monitor off atau AutoHotkey SendMessage, 0x112, 0xF170, 2,, Program Manager Built-in powercfg /requestsoverride process PresentationSettings.exe displaytidak akan berfungsi.

Leeroy
sumber
1

Insomnia mencegah jendela Anda untuk tidur tetapi itu bukan alat baris perintah, jadi skrip Anda dengan perintah harrymc adalah solusi yang lebih baik

fluxtendu
sumber