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

如何编写Bash脚本设置Ubuntu18.04时间并重启后不恢复

解决Ubuntu 18.04重启后手动设置时间失效的问题

你的脚本已经能临时修改系统时间,但重启后自动恢复是因为systemd-timesyncd服务(Ubuntu 18.04默认的时间同步服务)会在开机时重新启用NTP并同步时间。要让手动设置的时间持久化,我们需要彻底禁用这个自动同步服务,同时确保手动设置的时间被系统保留。

下面是改进后的完整脚本,附带详细注释:

#!/bin/bash
# 持久化设置系统时间的Bash脚本(适用于Ubuntu 18.04)

# 检查是否以root权限运行
if [ "$(id -u)" -ne 0 ]; then
    echo "请使用sudo或root权限运行此脚本!"
    exit 1
fi

# 检查是否传入了日期和时间参数
if [ $# -ne 2 ]; then
    echo "使用方法: $0 <YYYYMMDD> <HHMM>"
    echo "示例: $0 20240520 1430"
    exit 1
fi

# 第一步:关闭NTP自动同步
echo "正在关闭NTP自动同步..."
timedatectl set-ntp 0

# 第二步:设置系统日期和时间
echo "正在设置日期为 $1..."
date +%Y%m%d -s "$1"
echo "正在设置时间为 $2:00..."
date +%T -s "$2:00"

# 第三步:禁用并停止systemd-timesyncd服务(关键步骤,防止重启后恢复)
echo "正在禁用自动时间同步服务..."
systemctl stop systemd-timesyncd
systemctl disable systemd-timesyncd
# Mask服务防止其他进程意外激活它
systemctl mask systemd-timesyncd

# 验证设置结果
echo "当前时间设置状态:"
timedatectl status

echo "时间设置完成!重启后将保持手动设置的时间。"

关键步骤解释

  • 权限检查:修改系统时间需要root权限,脚本开头先验证权限,避免执行失败。
  • 参数校验:确保用户传入正确格式的日期(YYYYMMDD)和时间(HHMM),避免因参数错误导致脚本异常。
  • 彻底禁用自动同步服务:这是解决重启后时间恢复的核心——默认情况下systemd-timesyncd会在开机时自动启动并开启NTP同步,我们通过stop(立即停止服务)、disable(禁止开机自启)、mask(彻底屏蔽,防止被其他服务唤醒)三个命令彻底关闭它。
  • 结果验证:最后用timedatectl status显示当前状态,让你直观确认NTP已关闭、时间设置正确。

使用方法

  1. 将上述脚本保存为set-time.sh
  2. 赋予执行权限:chmod +x set-time.sh
  3. 以root权限运行(替换成你要设置的日期和时间):
    sudo ./set-time.sh 20240520 1430
    

恢复自动同步的方法

如果之后需要重新启用自动时间同步,只需执行以下命令:

sudo systemctl unmask systemd-timesyncd
sudo systemctl enable --now systemd-timesyncd
sudo timedatectl set-ntp 1

内容的提问来源于stack exchange,提问作者Yasin Kumar

火山引擎 最新活动