我有一个 Linux 服务器,只在工作日的工作时间需要。一直开机是没有意义的。
如何在没有任何监督的情况下让 Linux 系统在设定的时间和日期挂起和恢复?
答案1
为此,我创建了一个 shell 脚本,使用systemctl suspend
和rtcwake
命令来管理电源。
运行时,它将循环工作(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
。