解决Ubuntu系统级别开机自动关机
如果在操作系统开机任务级别定义了一个开机自动关机的任务怎么办
正如标题所述,本文的目的是解决开机就自动关机的问题,首先说一下这个问题是怎么出现的吧。
起因
起因是我想为我的Ubuntu的工控小主机配置定时开关机,以节约凌晨时段的电费,对于开机是使用BIOS支持的定时开机,BIOS设置即可,和问题无关,不多说。主要问题在自动关机,正是这个出毛病导致的题目的巨大问题。
这里我事后才知道应该直接使用shutdown命令的定时功能的,前期受AI诓骗使用了一个很复杂的方法,导致后面的一系列问题,AI让我创建一个service和一个timer文件,timer负责计时,而service负责具体的指令。shutdown.service文件中内容如下
1
2
3
4
5
6
[Unit]
Description=Scheduled system shutdown
[Service]
Type=oneshot
ExecStart=/sbin/shutdown -P now
shutdown.timer文件中的内容如下
1
2
3
4
5
6
7
8
9
[Unit]
Description=Run shutdown.service daily at 22:30
[Timer]
OnCalendar=*-*-* 22:30:00
Persistent=true # AI还给错了,应该写false的,否则错过时间系统还会下次开机给你补一次
[Install]
WantedBy=timers.target
使用命令sudo systemctl enable --now shutdown.timer将其设置为自动启动之后我还重启了一次电脑,并没有问题,直到第二天……
问题出现和解决
第二天早上机器没有定时开机,我还疑惑呢,还去找商家反映了,结果下午自己开机就发现根本打不开,后面就开始怀疑是不是自动关机任务出问题了,不过得先验证是不是,可是连桌面都还没有加载出来就已经直接关机了,我无从检查啊。
首先是使用安全模式,开机狂按ESC键,进入选Advanced options for Ubuntu,然后选带(recovery mode)的进去就是安全模式。不过很不幸,安全模式一样自动关机,不过好消息是我看到了原因,确实是shutdown.service执行了,不过不是shutdown.timer触发的,是直接被调用的(日志滚动过快,录像慢慢找看到的)。
尽管不知道为什么被调用了(现在事后我觉得可能是因为放在/etc/systemd/system 路径下了,所以自动扫描到就运行了),可是现在问题还没有解决,我该怎么进入系统呢?
首先我尝试了单纯禁用对应timer(可是按我现在的猜测不应该有用的,可是实际上有用),方法如下:
- 一样的,开机狂按
ESC - 不要选
Advanced options for Ubuntu,选中Ubuntu,然后按e(不是按回车!) - 这时进入了编辑界面,找到以 linux 开头的那一行,在这行的末尾,在 quiet 或 splash 之后(或其前面,用空格隔开),添加以下参数:
systemd.mask=shutdown.timer暂时禁用这个计时器,整体可能看起来如下linux /boot/vmlinuz-... root=/dev/sdaX ro quiet splash systemd.mask=shutdown.timer
这时我可以进入系统了,不过没有办法禁用shutdown.timer,原因是其被mask了,而且没有办法修改文件(我忘了是不是我没有加sudo,可能是这个原因导致的),所以我又重启电脑,使用单用户模式,参考文章,一样的界面,只不过改法不一样。这时我将shutdown.service直接改掉,把命令删除了,它就不能运行了。这时再正常启动系统就能进去了,问题解决了。
最终解决办法
尽管系统进去了,可是我的目的还没有达成啊,意思是我仍然需要一个定时关机的任务,怎么做呢?其实很简单,把shutdown.service之前的关机命令改成shutdown -P 22:30就可以了,所以现在的文件如下
1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=Scheduled system shutdown
[Service]
Type=oneshot
User=root
ExecStart=shutdown -P 22:30
StandardError=journal
[Install]
WantedBy=multi-user.target # 加上这个,否则不能设置自启动
随后使用sudo systemctl enable shutdown.service把这个服务配置为开机自启动就好了,这个定时是不会出问题的,因为是shutdown命令去计时的,除非系统时间错了。