Dormire e svegliarsi automaticamente in orari specifici


59

Come posso ibernare o dormire il mio desktop Ubuntu 10.10 e farlo "svegliare" il giorno successivo?

Ho visto un software che può farlo su Windows, quindi non può essere difficile su Ubuntu!

Risposte:


74

rtcwake

Il comando che ti interessa è rtcwake:

Questo programma viene utilizzato per inserire uno stato di sospensione del sistema fino al tempo di sveglia specificato.

analisi

Per trovare la sintassi corretta che funziona per te provare quanto segue:

sudo rtcwake -u -s 60 -m mem

Ciò dovrebbe sospendere il computer per 60 secondi prima del ripristino. Il parametro significativo è mem Hai diverse opzioni che puoi scegliere: gioca per trovare il valore che funziona meglio per te:

          standby
                 ACPI state S1. This state offers  minimal,  though  real,
                 power savings, while providing a very low-latency transi‐
                 tion back to a working system. This is the default mode.

          mem    ACPI state S3 (Suspend-to-RAM). This state offers signif‐
                 icant  power  savings  as everything in the system is put
                 into a low-power  state,  except  for  memory,  which  is
                 placed in self-refresh mode to retain its contents.

          disk   ACPI  state  S4  (Suspend-to-disk). This state offers the
                 greatest power savings, and  can  be  used  even  in  the
                 absence  of  low-level platform support for power manage‐
                 ment. This state operates  similarly  to  Suspend-to-RAM,
                 but  includes  a final step of writing memory contents to
                 disk.

          off    ACPI  state  S5  (Poweroff).  This  is  done  by  calling
                 '/sbin/shutdown'.   Not officially supported by ACPI, but
                 usually working.

          no     Don't suspend. The rtcwake command sets RTC  wakeup  time
                 only.

          on     Don't  suspend,  but  read  RTC  device  until alarm time
                 appears. This mode is useful for debugging.

sospendere fino a un momento noto

Uno script (in fondo a questo post) potrebbe essere usato per sospendere il tuo computer e riattivarlo in un momento specifico:

la sintassi è suspend_until [hh:mm]per esempio

sudo ./suspend_until 07:30

Salvare lo script come nome suspend_untile assegnargli i diritti di esecuzione, ad es

chmod +x suspend_until

cron

È possibile creare un processo cron cron che chiama questo script da eseguire in un momento specifico la sera e poi svegliarsi la mattina:

sudo crontab -e

Ora inserisci qualcosa di simile per eseguire lo script di sospensione alle 23:30:

30 23 * * * /home/myhomefolder/suspend_until 07:30

script suspend_until

#!/bin/bash

# Auto suspend and wake-up script
#
# Puts the computer on standby and automatically wakes it up at specified time
#
# Written by Romke van der Meulen <redge.online@gmail.com>
# Minor mods fossfreedom for AskUbuntu
#
# Takes a 24hour time HH:MM as its argument
# Example:
# suspend_until 9:30
# suspend_until 18:45

# ------------------------------------------------------
# Argument check
if [ $# -lt 1 ]; then
    echo "Usage: suspend_until HH:MM"
    exit
fi

# Check whether specified time today or tomorrow
DESIRED=$((`date +%s -d "$1"`))
NOW=$((`date +%s`))
if [ $DESIRED -lt $NOW ]; then
    DESIRED=$((`date +%s -d "$1"` + 24*60*60))
fi

# Kill rtcwake if already running
sudo killall rtcwake

# Set RTC wakeup time
# N.B. change "mem" for the suspend option
# find this by "man rtcwake"
sudo rtcwake -l -m mem -t $DESIRED &

# feedback
echo "Suspending..."

# give rtcwake some time to make its stuff
sleep 2

# then suspend
# N.B. dont usually require this bit
#sudo pm-suspend

# Any commands you want to launch after wakeup can be placed here
# Remember: sudo may have expired by now

# Wake up with monitor enabled N.B. change "on" for "off" if 
# you want the monitor to be disabled on wake
xset dpms force on

# and a fresh console
clear
echo "Good morning!"

NB

Modifica memin questa parte dello script per qualsiasi metodo di sospensione adatto a te:

# Set RTC wakeup time
sudo rtcwake -l -m mem -t $DESIRED &

Potrebbe anche essere necessario sostituire il -uflag al posto del -lflag a seconda che l'orologio hardware utilizzi l'ora UTC ( -u) o locale ( -l). Nota che l'orologio hardware è diverso dall'orologio di sistema che vedi nel tuo sistema operativo.

credito a redgeonline


1
quello che ho chiesto ... e molto altro ancora! Grazie per aver letto tra le righe!
drnessie,

3
grazie - appena leggermente aggiornato per evidenziare quale parte dello script è necessario modificare per qualsiasi metodo di sospensione adatto a te.
Fossfreedom

5
Il killall non è necessario, rtcwake non funziona come un demone, semplicemente scrive un valore in / sys / class / rtc / rtc0 / wakealarm; eseguendolo nuovamente, verrà scritto un altro valore nel file. Inoltre, rimuovi & alla fine di rtcwake, al termine verrà chiuso. Quindi è possibile rimuovere il comando sleep. E, se vuoi eseguire altri comandi di root nello script, perché non eseguire il tutto sudo invece di singoli comandi lì?
Unhammer,

# il mio vecchio laptop non si svegliava usando lo script sopra. quindi questo è quello che ho fatto # root crontab 30 20 * * * /home/gare/Documents/scripts/suspend_10_hours.sh >> /home/gare/Documents/scripts/suspend.log ~ $ altro / home / gare / Documents / script / suspend_10_hours.sh #! / bin / bash # il vecchio laptop non si riattiverà; quindi dì a rtcwake di sospendere per 10 ore # 10 ore * 60 minuti * 60 secondi = 36000 sudo rtcwake -u -s 36000 -m mem
gare

1
Oltre a quanto affermato da @unhammer, killall non è solo non necessario ma in realtà dannoso perché invierà SIGTERM a tutti i processi sul sistema che corrispondono a "killall". Si prega di incorporare le correzioni suggerite da Unhammer invece di indurre le persone a copiare pratiche sbagliate.
Jos

5

Usando rtcwake ho creato un semplice script bash. Usa php per tradurre il linguaggio naturale in tempo di sistema. Per esempio:

  • sudo ./cu "tomorrow 9am"

  • sudo ./cu "next monday 3pm"

  • sudo ./cu "1 hour ago"

    rtcwake: time doesn't go backward

Potete scaricarlo qui.

#!/bin/bash
export sdate=$1

date=`/usr/bin/php << 'EOF'
<?php
date_default_timezone_set("Etc/GMT-2");
$date = strtotime(GETENV("sdate"));
echo "\r".$date;
EOF`

rtcwake -m mem -t $date

4
Nota che date -d comprende già diverse stringhe del genere: cyberciti.biz/tips/…
unhammer

0

rtcwakenon ha avuto alcun effetto sulla mia macchina. Sulla mia scheda madre Asus, ho dovuto impostare il tempo di veglia nel bios. Ho trovato l'impostazione nel menu Avanzate> APM e ho dovuto usare UTC anche se il mio tempo di bios è impostato sull'ora orientale degli Stati Uniti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.