记录一些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语言,也称为Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的编程语言,因其高效性能和简洁的语法而受到广大开发者喜爱。在后端开发领域,Go语言以其强大的并发处理能力而独树一帜,这...
Go-Tengo是Go语言的一个重要扩展,它提供了一种可嵌入的脚本语言能力,使得开发者能够在Go程序中执行动态脚本。这种特性在许多场景下非常有用,比如游戏开发、数据分析、自动化任务处理或者作为配置语言等。Tengo的...
该项目是一款集成Shell、Python和Go语言编写的脚本诊断工具设计源码,总共有44个文件,其中包括23个Shell脚本文件、7个Python脚本文件、2个Markdown文件、1个许可证文件、1个awk脚本文件、1个toprc配置文件、1个Vim...
Go语言,又称Golang,是由Google开发的一种静态类型、编译型、并发型且具有垃圾回收功能的编程语言。它的设计目标是提高开发者的生产力和程序的运行效率。Go语言的特性包括简洁的语法、高效的并发模型(goroutines和...
Go-Neugram是一种独特的编程语言,它设计的目的是与Go语言紧密结合,提供了一种用于与Go软件包交互的轻量级脚本解决方案。通过利用Go的语法结构和类型系统,Go-Neugram旨在为开发者提供一种既熟悉又高效的工具,以便...
毕业设计基于Go语言实现的论文评价系统源码带数据库脚本.zip毕业设计基于Go语言实现的论文评价系统源码带数据库脚本.zip毕业设计基于Go语言实现的论文评价系统源码带数据库脚本.zip毕业设计基于Go语言实现的论文评价...
该项目是一款基于Go语言的脚本版本管理与定时运行托管服务设计源码,包含25个文件,涵盖Go源码、Python脚本、HTML模板以及SQL数据库文件。系统旨在实现脚本的版本控制与自动化运行,适用于构建高效的脚本托管与执行...
Tengo语言Tengo是Go的一种小型,动态,快速,安全的脚本语言。 Tengo是快速和安全的,因为它在本机Go中编写的基于堆栈的VM上被编译/执行为字节码。 / * Tengo语言Tengo语言Tengo是Go的一种小型,动态,快速,安全的...
FLASH脚本语言详解 FLASH脚本语言是用于创建交互式FLASH动画和应用程序的脚本语言,具有强大的编程能力和灵活的应用性。 FLASH脚本语言可以用来控制FLASH电影的播放、交互、动画和其他效果。 FLASH脚本语言的主要...
Go 语言以其高效的性能、简洁的语法和强大的并发支持而备受推崇,而 Lua 则是一种轻量级的脚本语言,常用于游戏开发和其他嵌入式系统。结合两者,我们可以创建一个快速且易于维护的解释器。 首先,我们要理解 Lua ...
`update-golang`是一个专为Linux开发环境设计的实用工具,它使得Go语言版本的管理和更新变得轻而易举。 首先,让我们深入了解`update-golang`脚本的工作原理。这个脚本通常由bash编写,它会自动检测当前系统的...
Golang作为一种静态类型的编程语言,其构建过程相比其他语言更为简洁,但是通过编写构建脚本,我们可以进一步提高工程的可维护性和复用性。 首先,让我们来看看“生成多个可执行文件”这一知识点。在Golang中,一个...
基于go语言的定时脚本任务.zip 示例代码 package xz_crontab import ( "context" "log" "testing" "time" ) func Test_crontab(t *testing.T) { jobs := []Job{ { Name: "test", Par: "1", //...
Go语言,又称为Golang,是由Google设计的一种开放源代码的编程语言。它具备高效性、简洁性和易用性的特点,在现代软件开发领域备受青睐。以下是Go语言的一些关键特性: 1. **快速编译**: Go语言能在几秒钟内编译...
在Go语言中,我们可以利用Lua脚本来操作Redis数据库,以此提高效率并确保操作的原子性。Redis支持在服务器端执行Lua脚本,这样可以减少网络通信的开销,并且提供了事务处理般的特性,保证了脚本执行的完整性。本文将...
该项目是采用Go语言、Shell脚本及HTML编写的开源云原生平台Kurator的设计源码,包含578个文件,涵盖226个YAML配置文件、218个Go源文件、50个Markdown文档、21个Shell脚本、10个HTML文件、9个模板文件、8个PNG图片...
本文讲述了作者从Python转向Go语言的心路历程,强调了Go语言在语法结构、项目布局、类型系统等方面的显著特点,以及在切换语言过程中遇到的差异和挑战,并提供了克服这些挑战的建议和资源。 首先,作者表达了对...
go语言入门进阶学习资料包:go语言入门,go语言常见问题,beego框架学习资料及项目管理,后台管理等等各种应用范例含源码及MYSQL数据库脚本,值得大家学习。特分享给大家,希望go语言越来越受关注。