记录一些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的可嵌入脚本语言
geist:golang脚本编制 注意:2015年7月9日:几乎是汽具:这是愿景声明和原理证明,而不是成品工具(尚未提供)。 Geist(德语发音:[ˈaaɪst])是德语单词。 根据上下文的不同,它可以翻译为英语单词mind,spirit...
zygomyszygomys 是一种可嵌入的脚本语言。 它是一个具有面向对象风格的现代化 Lisp,提供了一个解释器和 REPL(Read-Eval-Print-Loop;也就是说,它带有一个命令行交互界面)。zygomys 允许您创建一个特定语言来驱动...
Tengo语言Tengo是Go的一种小型,动态,快速,安全的脚本语言。 Tengo是快速和安全的,因为它在本机Go中编写的基于堆栈的VM上被编译/执行为字节码。 / * Tengo语言Tengo语言Tengo是Go的一种小型,动态,快速,安全的...
该语言使用Go的语法表达式,并紧跟其类型系统。 意图是与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的...
go语言入门进阶学习资料包:go语言入门,go语言常见问题,beego框架学习资料及项目管理,后台管理等等各种应用范例含源码及MYSQL数据库脚本,值得大家学习。特分享给大家,希望go语言越来越受关注。
主要介绍了go语言执行windows下命令行的方法,实例分析了Go语言操作windows下命令行的技巧,需要的朋友可以参考下
打开命令行界面,并导航到包含 hello.go 文件的目录。...请确保你已经安装了 Go 语言环境,并且 go 命令可以在你的命令行中直接使用。如果你还没有安装 Go,请访问 Go 语言的官方网站 下载并安装。
Tengo是Go的一种小型,动态,快速,安全的脚本语言。 Tengo是和安全的,因为它在以本机Go编写的基于堆栈的VM上作为字节码进行编译/执行。 /* The Tengo Language */ fmt := import ( "fmt" ) each := func ( seq ...
【毕业设计】基于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语言工具单用户安装甚至删除的简单Bash脚本。___下载.zip
项目名称:gosql - 高效便捷的Go语言数据库操作库 项目语言:Go 文件构成:共计40个文件,包括: - Go 源码文件:30个 - Markdown 文档:3个 - YAML 配置文件:1个 - Git 忽略配置:1个 - 许可证文件:1个 - ...
本设计源码提供了一个基于Go语言和Javascript的教师资格培训管理系统。项目包含487个文件,主要使用Javascript、Go、HTML和CSS编程语言。文件类型包括102个JavaScript脚本文件、99个PNG图片文件、91个Go源代码文件、...