记录一些go脚本,使用定时器,信号,go轻量级线程,调用系统命令,压缩,计算md5,列表,获取本机IP等功能
(向程序发送信号如:kill -2 进程号)
package main import ( "os"; "os/signal"; "os/exec" "syscall" "net" "time" "strconv"; "strings" "bufio" "io/ioutil" "fmt" "archive/zip" "crypto/md5" l "container/list" "bytes" // "encoding/hex" "io" ) const ( path string = "/root/logs/" log_pos string = "log_watcher.pos" log_access string = "access.log" log_upload string = "upload_access.log" salt string = "salt-value" ) var restarter int = 0 var localip string var uploadfiles = l.New() //------------------------------------------------------------------------------ func check(err error) bool { if err != nil { // panic(err) return false } return true } func get_local_ip() (string) { ifi, err := net.InterfaceByName("eth0") check(err) addrs, err := ifi.Addrs() check(err) for _,a := range addrs { if ip := strings.Split(a.String(),"/"); len(ip) > 1 { return ip[0] } } ifi, err = net.InterfaceByName("bond0") check(err) addrs, err = ifi.Addrs() check(err) for _,a := range addrs { if ip := strings.Split(a.String(),"/"); len(ip) > 1 { return ip[0] } } ifi, err = net.InterfaceByName("br0") check(err) addrs, err = ifi.Addrs() check(err) for _,a := range addrs { if ip := strings.Split(a.String(),"/"); len(ip) > 1 { return ip[0] } } panic("IP") } func load_data(filename string) (string) { buff, err := ioutil.ReadFile(filename) if !check(err) { return "" } return string(buff) } func save_data(filename, data string) { f, err := os.OpenFile(filename, os.O_WRONLY | os.O_CREATE | os.O_TRUNC , 0755) if !check(err) { return } defer f.Close() f.WriteString(data) } //------------------------------------------------------------------------------ func restart() { ch := make(chan os.Signal, 1) signal.Notify(ch, syscall.SIGINT) for { <-ch restarter = 1 } } //------------------------------------------------------------------------------ func upload_append(filename, line string) { f, err := os.OpenFile(filename, os.O_RDWR | os.O_CREATE | os.O_APPEND , 0755) if !check(err) { return } defer f.Close() f.WriteString(line) } func worker(pos int64, line string) { upload_append(log_upload, line) if int(pos) % 10 ==0 { save_data(log_pos, strconv.Itoa(int(pos))) } } //------------------------------------------------------------------------------ func compress() { // compress t := time.Now().Format("20060102_15_04") filename := path + "upload_access_" + t + ".zip" outf, err := os.Create(filename) if !check(err) { return } defer outf.Close() //defer os.Remove(filename) zw := zip.NewWriter(outf) f, err := zw.Create(log_upload) if !check(err) { os.Remove(filename); return } buff, err := ioutil.ReadFile(log_upload) if !check(err) { os.Remove(filename); return } _, err = f.Write(buff) if !check(err) { os.Remove(filename); return } zw.Close() os.Remove(log_upload) uploadfiles.PushFront(filename) } func upload() { file := uploadfiles.Back() if file != nil { filename,_ := file.Value.(string) ts := strconv.Itoa(int(time.Now().Unix()) - 8 * 3600) h := md5.New() io.WriteString(h, salt + string(ts)) k := fmt.Sprintf("%x", h.Sum(nil)) k = k[0:10] var out bytes.Buffer cmd := exec.Command("/bin/sh","-c","curl -F \"action=upload\" -F \"t="+string(ts)+"\" -F \"k="+k+"\" -F \"f="+localip+"\" --limit-rate 50k --connect-timeout 60 --max-time 600 -F \"Filedata=@"+filename+"\" \"http://127.0.0.1/test.php\"") cmd.Stdout = &out err := cmd.Run() if !check(err) { return } if out.String() == "1" { uploadfiles.Remove(file) os.Remove(filename) } } } func compress_timer() { for { timer := time.NewTicker(250 * time.Second) for { select { case <- timer.C: go compress() } } } } func upload_timer() { for { timer := time.NewTicker(30 * time.Second) for { select { case <- timer.C: upload() } } } } //------------------------------------------------------------------------------ func main() { os.Chdir(path) //get local ip localip = get_local_ip() //set timer to upload go compress_timer() go upload_timer() go restart() //load info cur_pos := load_data(log_pos) //read access log f, err := os.OpenFile(log_access, os.O_RDONLY, 0) if !check(err) { return } pos, _ := strconv.ParseInt(cur_pos, 0, 64) _, err = f.Seek(pos, os.SEEK_SET) if !check(err) { return } br := bufio.NewReader(f) for { line , err := br.ReadString('\n') pos, _ = f.Seek(0, os.SEEK_CUR) if err == io.EOF { time.Sleep(1 * time.Second) if restarter == 1 { f.Close() f, _ = os.OpenFile(log_access,os.O_RDONLY,0) _, err = f.Seek(0, os.SEEK_SET) br = bufio.NewReader(f) restarter = 0 } } else { go worker(pos, line) } } }
相关推荐
go语言实现京东抢茅台脚本源码
毕业设计基于Go语言实现的论文评价系统源码带数据库脚本.zip毕业设计基于Go语言实现的论文评价系统源码带数据库脚本.zip毕业设计基于Go语言实现的论文评价系统源码带数据库脚本.zip毕业设计基于Go语言实现的论文评价...
基于go语言的定时脚本任务.zip 示例代码 package xz_crontab import ( "context" "log" "testing" "time" ) func Test_crontab(t *testing.T) { jobs := []Job{ { Name: "test", Par: "1", //...
Tengo是Go的可嵌入脚本语言
go语言入门进阶学习资料包:go语言入门,go语言常见问题,beego框架学习资料及项目管理,后台管理等等各种应用范例含源码及MYSQL数据库脚本,值得大家学习。特分享给大家,希望go语言越来越受关注。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: ...
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: ...
geist:golang脚本编制 注意:2015年7月9日:几乎是汽具:这是愿景声明和原理证明,而不是成品工具(尚未提供)。 Geist(德语发音:[ˈaaɪst])是德语单词。 根据上下文的不同,它可以翻译为英语单词mind,spirit...
zygomyszygomys 是一种可嵌入的脚本语言。 它是一个具有面向对象风格的现代化 Lisp,提供了一个解释器和 REPL(Read-Eval-Print-Loop;也就是说,它带有一个命令行交互界面)。zygomys 允许您创建一个特定语言来驱动...
该语言使用Go的语法表达式,并紧跟其类型系统。 意图是与Go软件包进行轻量级的交互。
Tengo语言Tengo是Go的一种小型,动态,快速,安全的脚本语言。 Tengo是快速和安全的,因为它在本机Go中编写的基于堆栈的VM上被编译/执行为字节码。 / * Tengo语言Tengo语言Tengo是Go的一种小型,动态,快速,安全的...
2.Go语言基础 2.1. 你好,Go 2.2. Go基础 2.3. 流程和函数 2.4. struct 2.5. 面向对象 2.6. interface 2.7. 并发 2.8. 小结 3.Web基础 3.1 web工作方式 3.2 Go搭建一个简单的web服务 3.3 Go如何使得web工作 3.4 Go的...
打开命令行界面,并导航到包含 hello.go 文件的目录。...请确保你已经安装了 Go 语言环境,并且 go 命令可以在你的命令行中直接使用。如果你还没有安装 Go,请访问 Go 语言的官方网站 下载并安装。
Tengo是Go的一种小型,动态,快速,安全的脚本语言。 Tengo是和安全的,因为它在以本机Go编写的基于堆栈的VM上作为字节码进行编译/执行。 /* The Tengo Language */ fmt := import ( "fmt" ) each := func ( seq ...
主要介绍了go语言执行windows下命令行的方法,实例分析了Go语言操作windows下命令行的技巧,需要的朋友可以参考下
【毕业设计】基于go语言实现的排课抢课系统【后端源码+SQL脚本】.zip 本项目来自于字节跳动后端技术训练营,基于go语言实现了一个具备登录,成员管理,排课,抢课功能的选排课系统。
例如,以下是合法的Go +源代码:a:= [1、2、3.4] println(a)我们如何使用Go语言来做到这一点? 包main func main(){a:= [] float64 {1,2,3.4} println(a)}当然,我们不仅要做一些少打字的事情。 为了
基于Go语言实现的论文评价系统源码+数据库(毕设项目).zip 基于Go语言实现的论文评价系统源码+数据库(毕设项目).zip 基于Go语言实现的论文评价系统源码+数据库(毕设项目).zip 【备注】 主要针对计算机相关专业的正在...
1. 快速通过脚本在Centos7.9系统上进行安装go语言编译环境 2. 通过脚本进行执行后、可配合博客进行kubeadm默认证书时间修改
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: ...