Go 项目 小程序守护DNS go cmd 长命令

DNS与NTP


NTP 本质是执行一个命令 : 

ntpdate -u time.google.com
使用PI用户不可以

需要使用root用户

因为需要修改本地时间
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAR0tvU29u,size_20,color_FFFFFF,t_70,g_se,x_16

使用go是执行这个CMD 在ROOT下面执行

/测试1
package main

import (
	"log"
	"os/exec"
)

func ntp_sync() {
	cmd := exec.Command("ntpdate", "-u", "time.google.com")
	stdout, err := cmd.Output()
	if err != nil {
		log.Printf("[NTP] Fail to sync time: %v\r\n", err)
		return
	}
	log.Printf("[NTP] Sync time, %s\r\n", string(stdout))
}

func main()  {
	ntp_sync()
}

 


/测试2
package main

import (
	"log"
	"os/exec"
)

func ntp_sync() error {
	ntp_server := []string{"time.nist.gov", "time.google.com", "time.cloudflare.com", "216.239.35.8", "162.159.200.1"}
	var err error
	var stdout []byte
	for _, addr := range ntp_server {
		cmd := exec.Command("ntpdate", "-u", addr)
		stdout, err = cmd.Output()
		if err != nil {
			log.Printf("[NTP] Fail to sync time with %s: %v\r\n", addr, err)
		} else {
			log.Printf("[NTP] Sync time with %s, %s\r\n", addr, string(stdout))
			return nil
		}
	}
	return err
}


func main()  {
	ntp_sync()
}

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAR0tvU29u,size_20,color_FFFFFF,t_70,g_se,x_16

ntpdate -u time.google.com
ntpdate -u 162.159.200.1

也即是上面2个CMD都可以 

 

 

 

 

 

 

DNS

它是把ip  string类翻译为数字类的 

Linux中的DNS客户端配置

根据文章 就是这里的     /etc/resolv.conf 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAR0tvU29u,size_17,color_FFFFFF,t_70,g_se,x_16

 

默认是127.0.0.1

修改为0.0.0.1 可以看到

A---无法ping出去了

B---NTP失败 string类的IP地址  只有数字类的可以 也就是

ntpdate -u time.google.com  --失败
ntpdate -u 162.159.200.1   --成功

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAR0tvU29u,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

 

++++++++++++++++++

    cmd := exec.Command("ntpdate", "-u", "time.google.com")

这种东西 真的太糟糕了

很难使用

比如ping 在Linux里面不会停止 在WIN10会停止

Linux ping 命令 | 菜鸟教程

# ping -c 2 www.runoob.com

用这个就可以控制2个以后停止!!但是上面不好用!!!

参考 go语言 exec Command 执行长命令 - Keeper丶 - 博客园

统一用这个!!!!!

//cmd := exec.Command("ping", "www.baidu.com")//WIN10
cmd := exec.Command("/bin/sh", "-c", "ping -c 2 www.baidu.com")//PI

 

cmd := exec.Command("/bin/sh","sudo service dnsmasq restart")

 

代码:

package main

import (
	"log"
	"os/exec"
	"time"
)

func dns_reset() {
	cmd := exec.Command("/bin/sh","sudo service dnsmasq restart")
	stdout, err := cmd.Output()
	if err != nil {
		log.Printf("[DNS] Fail to DNS: %v\r\n", err)
		return
	}
	log.Printf("[DNS] success to DNS:, %s\r\n", string(stdout))
}

func run_ping() {
	//cmd := exec.Command("ping", "www.baidu.com")//WIN10
	cmd := exec.Command("/bin/sh", "-c", "ping -c 2 www.baidu.com")//PI

	stdout, err := cmd.Output()
	if err != nil {
		log.Printf("[DNS] Fail to ping: %v\r\n", err)
		dns_reset()
		return
	}
	log.Printf("[DNS] success to ping:, %s\r\n", string(stdout))
}

func main()  {
	for {
		run_ping()
		time.Sleep(time.Minute*1)
	}
}

 

 

 

 

 

++++继续 常见代码框架 一个是时间驱动的周期 一个是关闭结束

package main

//package dns

import (
	"fmt"
	"log"
	"net"
	"time"
)

func Test() {
	iprecords, err := net.LookupIP("movella.com")
	for _, ip := range iprecords {
		fmt.Println(ip)
	}
	fmt.Println("------end------")

	if err != nil {
		log.Printf("Could not get IPs: %v\r\n", err)
	}
}

func Daemon_Start(close chan struct{}) {
	t := time.NewTicker(time.Second)
	defer t.Stop()
	for {
		select {
		case <-close:
			log.Printf("DNS deamon stop\r\n")
			return
		case <-t.C:
			Test()
		}
	}
}

func main() {
	dns_daemon_close := make(chan struct{})
	go Daemon_Start(dns_daemon_close)
	defer func() { dns_daemon_close <- struct{}{} }() // close dns deamon

	time.Sleep(time.Second*3)
}

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAR0tvU29u,size_18,color_FFFFFF,t_70,g_se,x_16

 

上面代码的优化 因为最后暴力的延时 没有看到最后的lOG

package main

//package dns

import (
	"fmt"
	"log"
	"net"
	"sync"
	"time"
)

func Test() {
	iprecords, err := net.LookupIP("movella.com")
	for _, ip := range iprecords {
		fmt.Println(ip)
	}
	fmt.Println("------end------")

	if err != nil {
		log.Printf("Could not get IPs: %v\r\n", err)
	}
}

var wg sync.WaitGroup //第一步 全局变量

func Daemon_Start(close chan struct{}) {
	t := time.NewTicker(time.Second)
	defer t.Stop()
	for {
		select {
		case <-close:
			log.Printf("\r\nDNS deamon stop\r\n")
			return
		case <-t.C:
			Test()
			wg.Done() //第三步 每次-1
		}
	}
}

func main() {
	dns_daemon_close := make(chan struct{})
	go Daemon_Start(dns_daemon_close)
	//defer func() { dns_daemon_close <- struct{}{} }() // close dns deamon
	//time.Sleep(time.Second*3)
	wg.Add(4) //第二部 最开始是计数总数
	wg.Wait()//第四步 等计数-1 -1 -1变为0
	dns_daemon_close <- struct{}{}
	time.Sleep(time.Second * 3)//为了看最后的log
}

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAR0tvU29u,size_18,color_FFFFFF,t_70,g_se,x_16

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值