增加 重复任务丢弃特性
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,3 +2,4 @@
|
|||||||
fileboy
|
fileboy
|
||||||
fileboy.exe
|
fileboy.exe
|
||||||
filegirl.yaml
|
filegirl.yaml
|
||||||
|
build-*
|
60
fileboy.go
60
fileboy.go
@@ -1,19 +1,15 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"gopkg.in/fsnotify/fsnotify.v1"
|
"gopkg.in/fsnotify/fsnotify.v1"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
|
||||||
"path"
|
"path"
|
||||||
"strconv"
|
"strconv"
|
||||||
"sync"
|
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -28,9 +24,7 @@ var (
|
|||||||
|
|
||||||
watcher *fsnotify.Watcher
|
watcher *fsnotify.Watcher
|
||||||
|
|
||||||
cmd *exec.Cmd
|
tasker *Tasker
|
||||||
|
|
||||||
runLock sync.Mutex
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type changeFile struct {
|
type changeFile struct {
|
||||||
@@ -67,14 +61,7 @@ func eventDispatcher(event fsnotify.Event) {
|
|||||||
case fsnotify.Create:
|
case fsnotify.Create:
|
||||||
case fsnotify.Write:
|
case fsnotify.Write:
|
||||||
log.Println("event write : ", event.Name)
|
log.Println("event write : ", event.Name)
|
||||||
if cmd != nil {
|
tasker.Put(&changeFile{
|
||||||
err := cmd.Process.Kill()
|
|
||||||
if err != nil {
|
|
||||||
log.Println("err: ", err)
|
|
||||||
}
|
|
||||||
log.Println("stop old process ")
|
|
||||||
}
|
|
||||||
go run(&changeFile{
|
|
||||||
Name: relativePath(projectFolder, event.Name),
|
Name: relativePath(projectFolder, event.Name),
|
||||||
Changed: time.Now().UnixNano(),
|
Changed: time.Now().UnixNano(),
|
||||||
Ext: ext,
|
Ext: ext,
|
||||||
@@ -84,46 +71,6 @@ func eventDispatcher(event fsnotify.Event) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func run(cf *changeFile) {
|
|
||||||
runLock.Lock()
|
|
||||||
defer runLock.Unlock()
|
|
||||||
for i := 0; i < len(cfg.Command.Exec); i++ {
|
|
||||||
carr := cmdParse2Array(cfg.Command.Exec[i], cf)
|
|
||||||
cmd = exec.Command(carr[0], carr[1:]...)
|
|
||||||
//cmd.SysProcAttr = &syscall.SysProcAttr{CreationFlags: syscall.CREATE_UNICODE_ENVIRONMENT}
|
|
||||||
cmd.Stdin = os.Stdin
|
|
||||||
//cmd.Stdout = os.Stdout
|
|
||||||
cmd.Stderr = os.Stderr
|
|
||||||
cmd.Dir = projectFolder
|
|
||||||
cmd.Env = os.Environ()
|
|
||||||
stdout, err := cmd.StdoutPipe()
|
|
||||||
if err != nil {
|
|
||||||
log.Println("error=>", err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
cmd.Start()
|
|
||||||
reader := bufio.NewReader(stdout)
|
|
||||||
for {
|
|
||||||
line, err2 := reader.ReadString('\n')
|
|
||||||
if err2 != nil || io.EOF == err2 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
log.Print(line)
|
|
||||||
}
|
|
||||||
err = cmd.Wait()
|
|
||||||
if err != nil {
|
|
||||||
log.Println("cmd wait err ", err)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
err = cmd.Process.Kill()
|
|
||||||
if err != nil {
|
|
||||||
log.Println("cmd cannot kill ", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Println("end ")
|
|
||||||
}
|
|
||||||
|
|
||||||
func addWatcher() {
|
func addWatcher() {
|
||||||
log.Println("collecting directory information...")
|
log.Println("collecting directory information...")
|
||||||
dirs := make([]string, 0)
|
dirs := make([]string, 0)
|
||||||
@@ -183,6 +130,7 @@ func initWatcher() {
|
|||||||
defer watcher.Close()
|
defer watcher.Close()
|
||||||
|
|
||||||
done := make(chan bool)
|
done := make(chan bool)
|
||||||
|
tasker = newTasker(2000)
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
@@ -229,7 +177,7 @@ func parseArgs() {
|
|||||||
return
|
return
|
||||||
case "exec":
|
case "exec":
|
||||||
parseConfig()
|
parseConfig()
|
||||||
run(new(changeFile))
|
newTasker(0).run(new(changeFile))
|
||||||
return
|
return
|
||||||
case "version":
|
case "version":
|
||||||
fallthrough
|
fallthrough
|
||||||
|
95
tasker.go
Normal file
95
tasker.go
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"io"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Tasker struct {
|
||||||
|
lastTaskId int64
|
||||||
|
delay int
|
||||||
|
cmd *exec.Cmd
|
||||||
|
putLock sync.Mutex
|
||||||
|
runLock sync.Mutex
|
||||||
|
}
|
||||||
|
|
||||||
|
func newTasker(delay int) *Tasker {
|
||||||
|
return &Tasker{
|
||||||
|
delay: delay,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Tasker) Put(cf *changeFile) {
|
||||||
|
if t.delay < 1 {
|
||||||
|
go t.run(cf)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
t.putLock.Lock()
|
||||||
|
defer t.putLock.Unlock()
|
||||||
|
t.lastTaskId = cf.Changed
|
||||||
|
go func() {
|
||||||
|
tc := time.Tick(time.Millisecond * time.Duration(t.delay))
|
||||||
|
<-tc
|
||||||
|
if t.lastTaskId > cf.Changed {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
t.preRun(cf)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Tasker) preRun(cf *changeFile) {
|
||||||
|
if t.cmd != nil {
|
||||||
|
err := t.cmd.Process.Kill()
|
||||||
|
if err != nil {
|
||||||
|
log.Println("err: ", err)
|
||||||
|
}
|
||||||
|
log.Println("stop old process ")
|
||||||
|
}
|
||||||
|
go t.run(cf)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Tasker) run(cf *changeFile) {
|
||||||
|
t.runLock.Lock()
|
||||||
|
defer t.runLock.Unlock()
|
||||||
|
for i := 0; i < len(cfg.Command.Exec); i++ {
|
||||||
|
carr := cmdParse2Array(cfg.Command.Exec[i], cf)
|
||||||
|
log.Println(carr)
|
||||||
|
t.cmd = exec.Command(carr[0], carr[1:]...)
|
||||||
|
//cmd.SysProcAttr = &syscall.SysProcAttr{CreationFlags: syscall.CREATE_UNICODE_ENVIRONMENT}
|
||||||
|
t.cmd.Stdin = os.Stdin
|
||||||
|
//cmd.Stdout = os.Stdout
|
||||||
|
t.cmd.Stderr = os.Stderr
|
||||||
|
t.cmd.Dir = projectFolder
|
||||||
|
t.cmd.Env = os.Environ()
|
||||||
|
stdout, err := t.cmd.StdoutPipe()
|
||||||
|
if err != nil {
|
||||||
|
log.Println("error=>", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_ = t.cmd.Start()
|
||||||
|
reader := bufio.NewReader(stdout)
|
||||||
|
for {
|
||||||
|
line, err2 := reader.ReadString('\n')
|
||||||
|
if err2 != nil || io.EOF == err2 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
log.Print(line)
|
||||||
|
}
|
||||||
|
err = t.cmd.Wait()
|
||||||
|
if err != nil {
|
||||||
|
log.Println("cmd wait err ", err)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
err = t.cmd.Process.Kill()
|
||||||
|
if err != nil {
|
||||||
|
log.Println("cmd cannot kill ", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Println("end ")
|
||||||
|
}
|
Reference in New Issue
Block a user