如何编写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已关闭、时间设置正确。
使用方法
- 将上述脚本保存为
set-time.sh - 赋予执行权限:
chmod +x set-time.sh - 以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




