You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ubuntu 24.04 LTS下实现定时关机(支持取消)及解决开机任务不执行问题的求助

Ubuntu 24.04 LTS下实现定时关机(支持取消)及解决开机任务不执行问题的求助

看起来你遇到的核心问题是默认多用户目标(命令行模式)下,开机任务的触发时机不对,加上GUI启动应用完全不匹配你的使用场景,导致定时关机和警告消息都没生效。我来一步步帮你解决:

先分析问题根源

  1. 启动应用为啥没用?:你默认是多用户命令行模式,而"Startup Applications"是GNOME桌面专属的,只有进入图形目标(graphical.target)才会加载,所以完全无效很正常。
  2. crontab @reboot为啥失效?@reboot是系统一启动就执行,此时你还没登录用户,不仅终端看不到输出,而且很多用户环境变量(比如PATH、用户权限上下文)都没加载,导致atshutdown命令可能无法正常执行。

解决方案:让脚本在用户登录时触发

既然你是默认进命令行、需要登录后才看到警告,那最佳方式是把脚本绑定到用户登录后的环境加载流程里,比如用~/.profile文件(命令行登录时一定会加载)。

步骤1:编写定时关机+警告脚本

先创建一个可执行的shell脚本,比如shutdown_warning.sh

nano ~/shutdown_warning.sh

把下面内容粘贴进去(注释已经写得很清楚):

#!/bin/bash

# 判断当前环境是命令行还是GUI,分别输出警告
if [ -n "$DISPLAY" ]; then
    # GUI环境用桌面通知
    notify-send "⚠️  定时关机提醒" "系统将在今日00:00自动关机!取消请执行:sudo shutdown -c 或 atrm <任务ID>"
else
    # 命令行环境直接输出到终端
    echo -e "\033[33m⚠️  系统将在今日00:00自动关机!若需取消,请执行命令: sudo shutdown -c 或 atrm <任务ID>\033[0m"
fi

# 先清理可能存在的旧定时任务,避免重复
existing_job=$(at -l | grep "shutdown -h 00:00" | awk '{print $1}')
if [ -n "$existing_job" ]; then
    atrm $existing_job
fi

# 创建新的定时关机任务
echo "shutdown -h 00:00" | at 00:00

# 输出任务ID方便用户查看
job_id=$(at -l | grep "shutdown -h 00:00" | awk '{print $1}')
echo -e "定时关机任务已创建,任务ID: \033[32m$job_id\033[0m"

保存退出后,给脚本加执行权限:

chmod +x ~/shutdown_warning.sh

步骤2:设置登录时自动执行脚本

编辑用户的~/.profile文件(命令行登录时会自动加载):

nano ~/.profile

在文件末尾添加一行:

# 开机登录后执行定时关机警告脚本
~/shutdown_warning.sh

保存退出即可。

步骤3:验证效果

重启系统,登录命令行后,你会立刻看到黄色的警告消息,用at -l命令可以看到定时关机任务已经存在。如果要取消关机,直接执行sudo shutdown -c或者atrm <任务ID>就行。

额外补充:如果非要用crontab @reboot

如果你还是想尝试系统级的开机触发,那需要把脚本的输出重定向到日志文件(因为此时没有终端),并且确保命令的环境变量齐全。比如在用户crontab里添加:

crontab -e

加入:

@reboot /home/你的用户名/shutdown_warning.sh >> /home/你的用户名/shutdown_log.txt 2>&1

但这种方式的问题是,你登录前脚本就跑了,终端看不到警告,只能事后看日志,所以还是推荐前面的登录触发方式。

备注:内容来源于stack exchange,提问作者John Paasche

火山引擎 最新活动