1.NTP授时的基本框架
时间同步在Debian环境使用NTP服务实现,在Debian平台,NTP是一个双向的协议------Debian,linux在设计时与git类似,有去中心化的考量。一些拥有固定IP的Debian设备,Debian鼓励这些用户加入NTP 服务池,以为更多非固定IP设备提供授时服务。
授时服务的主配置文件在/etc/ntp.conf中。普通用户需要关注的修改位置只有两处:
# You do need to talk to an NTP server or two (or three). #server ntp.your-provider.example server ntp.aliyun.com # pool.ntp.org maps to about 1000 low-stratum NTP servers. Your server will # pick a different set every time it starts up. Please consider joining the # pool: <http://www.pool.ntp.org/join.html> pool 0.debian.pool.ntp.org iburst pool 1.debian.pool.ntp.org iburst pool 2.debian.pool.ntp.org iburst pool 3.debian.pool.ntp.org iburst
整个ntp授时是个层级式的结构:
server <ip>的优先级更高
pool <ip> <args>优先级稍低
启动时linux会尝试依次和层级结构里的授时服务器进行时间同步。
2.对NTP配置文件的可编程修改
2.1参见例程
python
#!/bin/bash
# 获取当前脚本文件所在的目录
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
cd $SCRIPT_DIR
# 获取脚本所在的目录
script_dir=$(dirname "$0")
# 切换至应用程序所在的目录(相对cfg_daemon)
echo $script_dir
cd "$script_dir/.." || exit
# JSON文件路径
json_file="cfg/device_private.json"
# 使用jq解析JSON文件
# JSON文件路径
json_file="cfg/daemon_mqtt_message.json"
app_json_file=$(jq -r ".json_file" $json_file)
json_file=$app_json_file
ntp_server=$(jq -r ".hardware.ntp_server" $json_file)
#step 1. clear all ntpserver in ntp.conf
# 定义文件名
file_name="/etc/ntp.conf"
# 临时文件名
temp_file="ntp.conf.tmp"
# 使用sed命令删除文件中的 "server=" 字符串,并将结果写入临时文件
sed '/^server /d' $file_name > $temp_file
# 把新的配置加入
sed "/^#server ntp\.your-provider\.example$/a\server $ntp_server" $temp_file > $temp_file.new
sudo mv $temp_file.new $temp_file
# 将临时文件替换原始文件
sudo mv $temp_file $file_name
echo "ntp server has modified yet! $ntp_server"
脚本运行的结果,会把 增补上的ntp 服务器插入最高优先级的位置:
You do need to talk to an NTP server or two (or three).
#server ntp.your-provider.example
server ntp.aliyun.com
pool.ntp.org maps to about 1000 low-stratum NTP servers. Your server will
pick a different set every time it starts up. Please consider joining the
pool: <http://www.pool.ntp.org/join.html\>
pool 0.debian.pool.ntp.org iburst
pool 1.debian.pool.ntp.org iburst
2.2 例程说明
- 处理了.sh脚本与外部配置文件的相对路径
- 上面的配置文件实际有两级,这是将工程细分为子项目的标准实现。
- 修改/etc/ntp.conf时使用sed进行。
- 首先删除掉文件里的所有server 打头的配置项
- 然后将新的配置插入到文件的特定标志行的次一行
- 那个特定标志行是标准的/etc/ntp.conf中的一个注释行:
#server ntp.your-provider.example
附录A python调用涉及特权指令的.sh脚本的方法
python
#执行某个外部脚本.sh
def Invoke_Script(script_releated_path):
sh_path = os.path.join(project_path, script_releated_path)
if(os.path.exists(sh_path)):
subprocess.run(f'sudo {sh_path}', shell=True, check=False)
return True
return False