평일 근무 시간에만 필요한 Linux 서버가 있습니다. 항상 켜두는 것은 의미가 없습니다.
감독 없이 설정된 시간과 날짜에 Linux 시스템을 일시 중지하고 재개하는 방법은 무엇입니까?
답변1
이를 위해 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'
@reboot
또한 갑작스러운 정전으로 인해 일정이 중단되지 않도록 스크립트를 시간과 함께 crontab에 넣으세요 .
달리기:
sudo crontab -e
그리고 다음 줄을 추가하세요:
@reboot exec /root/power-schedule.sh
AC 전원이 감지되면 시스템의 전원이 켜지도록 UEFI/BIOS를 구성할 수도 있습니다. 이렇게 하면 전원이 꺼진 후 부팅이 발생합니다(일반적으로 기본 동작인 꺼진 상태를 유지하는 대신).
답변2
짧막 한 농담:
rtcwake -m mem -s $(($(date --date "20:30" +%s) - $(date +%s)))
네트워크 공유가 마운트되어 있거나 트래픽이 감지될 때 네트워크가 깨어나는 경우에는 작동하지 않습니다.
Wake on 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
.