我在一台旧的 optiplex 上运行着 Ubuntu 服务器 20.04LTS。我想弄清楚如何在闲置一段时间后自动关闭我的服务器。
解决这个问题的最好方法是什么?
[建议的答案只是展示如何从终端关机。根本不相关]
答案1
因此,让我进一步描述我的用例并提供答案
- 我在家里设置了一台服务器。它用于各种不同的事情,包括 NAS
- 当我不在家或者不使用它时我不希望它运行。
- 当我需要时,我会使用局域网唤醒来唤醒它
- 当空闲时我希望它关闭。
解决方案
- 使用 systemd 计时器
- 检查硬盘使用情况
- 不使用则关闭
- 创建 systemd 服务
/etc/systemd/system/idle-shutdown.service
[Unit]
description=Idle shutdown service
[Service]
Type=oneshot
Nice=19
IOSchedulingClass=idle
ExecStart=/home/kumudu/idle.sh
- 创建 systemd 计时器
/etc/systemd/system/idle-check.timer
[Unit]
Description=Idle check timer
[Timer]
# Run hourly
OnCalendar=*:0/15
Persistent=true
Unit=idle-shutdown.service
[Install]
WantedBy=timers.target
- 脚本
idle.sh
。它最初会等待 2 小时。之后会继续检查硬盘使用情况。它检查的磁盘是我拥有所有 samba 共享的磁盘。
#!/bin/bash
RUN_LIMIT_SEC=7200
# How long the machine has been idle for
RUN_TIME_SEC=$(/sbin/runuser -l kumudu -c "awk '{print \$1}' /proc/uptime")
echo "[idle-shutdown] Runtime is $RUN_TIME_SEC" | systemd-cat -p info;
if [ ${RUN_TIME_SEC%.*} -gt $RUN_LIMIT_SEC ] ;
then
DISK_USAGE1=$(iostat -md -p dm-1 | awk '/dm-1/ {print $2}')
sleep 10
DISK_USAGE2=$(iostat -md -p dm-1 | awk '/dm-1/ {print $2}')
echo "[idle-shutdown] Disk usage is $DISK_USAGE1, $DISK_USAGE2"
if [ ${DISK_USAGE2%.*} -eq ${DISK_USAGE1%.*} ] && [ ${DISK_USAGE2#*.} \> ${DISK_USAGE1#*.} ] || [ ${DISK_USAGE2%.*} -gt ${DISK_USAGE1%.*} ]; then
echo "[idle-shutdown] Disk is being used, ignoring shutdown. $DISK_USAGE1, $DISK_USAGE2" | systemd-cat -p info
else
echo "[idle-shutdown] Disk is not being used, powering off system. $DISK_USAGE1, $DISK_USAGE2" | systemd-cat -p info
# /bin/systemctl suspend -i
# If you prefer to shut down instead of suspend, comment the
# previous line and uncomment the following one:
/sbin/poweroff
fi
fi
- 启用计时器
sudo systemctl enable --now idle-check.timer
答案2
您可以使用 dconf 关闭服务器。但我不明白您为什么要这样做。如果服务器关闭,您必须先启动它,然后其他人才能再次通过 ssh 访问它。
但仍然有一个可能的解决方案:
dconf write /org/gnome/settings-daemon/plugins/power/sleep-inactive-ac-timeout 120
dconf write /org/gnome/settings-daemon/plugins/power/sleep-inactive-ac-type "shutdown"
这意味着,2分钟不活动(120秒)后,操作将关闭。(替代方案是暂停、休眠、不执行任何操作......)
您仍然应该考虑 WinEunuchs 的答案来实现他所写的脚本。
答案3
在系统设置中,设置服务器在 x 分钟不活动后关闭。
然后使用这个脚本当通过 ssh 登录输入任何内容时伪造服务器活动。
请注意,在 ssh 登录上运行作业并不构成活动。您实际上必须通过 ssh 输入一些内容才能伪造服务器活动。
在服务器关闭前 60、30、15、10、5、3、2 和 1 分钟,会向所有 ssh 用户广播一条警告消息,提示除非输入任何内容,否则服务器将关闭。
答案4
所以我为你找到了一个可能有用的解决方案!#首先你需要下载 Autopoweroff 包
wget https://github.com/deragon/autopoweroff/releases/download/3.0.0/autopoweroff-3.0.0-1.noarch.deb
#然后使用安装
sudo dpkg -i autopoweroff-3.0.0-1.noarch.deb
sudo apt-get install -f
然后,如果您使用 GNOME,只需在活动中查找自动电源关闭,否则转到 /etc/autopoweroff/autopoweroff.conf.dpkg-new 并以 sudo 用户身份修改空闲时间!
如果您使用该文件修改空闲关机设置,以下是我所做的
[NO_SHUTDOWN_TIME_RANGE]
StartHour=
EndHour=
# StartupDelay parameter (expressed in minutes):
#
# When the computer is booting up, if all the conditions are met and
# the computer is in the shutdown time range, as soon as Autopoweroff
# is started, the computer will shutdown. Thus, the user will never
# have the chance to boot into the computer. This is where the
# "delay" parameter comes in. If "delay" is set to 15 for example,
# Autopoweroff will not poweroff the computer even if all the
# conditions are met, for a period of 15 minutes after the computer
# has booted. This allows the user to login and change Autopoweroff's
# configuration.
#
#
# IdleTime parameter (expressed in minutes):
#
# Like a screensaver, Autopoweroff detects keyboard and mouse
# activity, and if there is any activity on the server, it would not
# be powered off regardless if all the other conditions are met. If
# set to 0, user activity on the server will be ignored.
[TIMEOUTS]
StartupDelay=5
IdleTime=30
#Part of the info was obtained here
https://www.ostechnix.com/auto-shutdown-reboot-suspend-hibernate-linux-system-specific-time/