如何让系统按时挂起和恢复?

如何让系统按时挂起和恢复?

我有一个 Linux 服务器,只在工作日的工作时间需要。一直开机是没有意义的。

如何在没有任何监督的情况下让 Linux 系统在设定的时间和日期挂起和恢复?

答案1

为此,我创建了一个 shell 脚本,使用systemctl suspendrtcwake命令来管理电源。

运行时,它将循环工作(15 分钟循环):

  • 检查现在是星期几,

  • 确定何时应该醒来

  • 检查是否应该立即暂停

#!/bin/bash

while [ 1=1 ]; do # repeat forever

        clear

        echo "Updated: $(date '+%F %T')"

        echo "### TIME SECTION"

        SLEEP_H=18 # What hour should the system suspend at?
        WAKE_H=8 # What hour should the system wake up at?

        # check what day of the week it is now
        DOW=$(date +%w) #  1 = monday, 5 = friday etc.

        echo "Day of week: $DOW"

        # check what time is it now
        H=$(date +%H)
        M=$(date +%M)

        NOW_S=$(date +%s)

        echo "Hour: $H, minute: $M"

        #date +%s --date "tomorrow 8:00"

        if [[ $DOW -lt 5 ]]; then
                echo "It's Monday to Thursday!"
                WAKE="tomorrow $WAKE_H:00"
        else
                echo "It's Friday to Sunday!"
                WAKE="monday $WAKE_H:00"
        fi

        WAKE_S="$(date --date "$WAKE" +%s)"

        WAKE_SR=$(( $WAKE_S - $NOW_S))

        echo
        echo "Wake: $WAKE"
        echo "Wake relative seconds: $WAKE_SR"
        echo
        rtcwake -m no -s "$WAKE_SR"

        # sleep section

        sleep 15m

        echo "### SLEEP SECTION"

        if [[ $H -gt $SLEEP_H ]]; then # sleep if the hour is right
                systemctl suspend
                continue
        else
                echo "It's too early to sleep"
        fi

        if [[ $DOW -gt 5 ]]; then # sleep if it's saturday or sunday
                systemctl suspend
                continue
        else
                echo "It's not weekend - gotta stay up!"
        fi

done

该脚本设置为使系统在周一至周五上午 8 点唤醒,并在下午 6 点入睡。

它会在周末和晚上睡觉。请随意根据您的需要进行修改。

我把这个脚本保存在/root/power-schedule.sh.确保它是可执行的:`sudo chmod +x /root/power-schedule.sh'

还要将脚本与时间一起放入 crontab 中,@reboot以确保突然断电不会打乱您的日程安排。

跑步:

sudo crontab -e

并添加这一行:

@reboot         exec /root/power-schedule.sh

您可能还想配置 UEFI/BIOS,以便机器在检测到交流电源时开机 - 这将导致它在断电后启动(而不是保持关闭状态 - 这通常是默认行为)。

答案2

一班轮:

rtcwake -m mem -s $(($(date --date "20:30" +%s) - $(date +%s)))

如果您安装了网络共享,或者您的网络在看到流量时被唤醒,则此操作将不起作用。

禁用 LAN 唤醒:

ethtool -s eno1 wol d

或者仅将其委托给“Magic Packet”:

ethtool -s eno1 wol m

要卸载网络共享:

sudo fuser /mount/share

并结束/终止这些进程,然后umount共享,或者umount -f -l如果必须的话。

有时需要一段时间才能超时,因此效果更好:

while sleep 1; do rtcwake -m mem -s $(($(date --date "20:30" +%s) - $(date +%s))) && break; done 

20:30也可以说代替tomorrow 9:00。如果您再次报告时间,请不要担心,rtcwake如果您的系统时钟是 ,它就会这样做UTC

相关内容