1
0
镜像自地址 https://github.com/tuna/tunasync.git 已同步 2025-12-07 23:16:47 +00:00

feature(worker): move command execution logic to a runner object

这个提交包含在:
bigeagle
2016-04-22 11:18:52 +08:00
父节点 16ead05160
当前提交 276ab233c5
共有 3 个文件被更改,包括 149 次插入44 次删除

查看文件

@@ -1,12 +1,10 @@
package worker
import (
"errors"
"os"
"os/exec"
"strings"
"github.com/anmitsu/go-shlex"
"github.com/codeskyblue/go-sh"
)
type cmdConfig struct {
@@ -21,8 +19,7 @@ type cmdProvider struct {
baseProvider
cmdConfig
command []string
cmd *exec.Cmd
session *sh.Session
cmd *cmdJob
}
func newCmdProvider(c cmdConfig) (*cmdProvider, error) {
@@ -49,39 +46,10 @@ func newCmdProvider(c cmdConfig) (*cmdProvider, error) {
return provider, nil
}
// Copied from go-sh
func newEnviron(env map[string]string, inherit bool) []string { //map[string]string {
environ := make([]string, 0, len(env))
if inherit {
for _, line := range os.Environ() {
// if os environment and env collapses,
// omit the os one
k := strings.Split(line, "=")[0]
if _, ok := env[k]; ok {
continue
}
environ = append(environ, line)
}
}
for k, v := range env {
environ = append(environ, k+"="+v)
}
return environ
func (p *cmdProvider) InitRunner() {
}
// TODO: implement this
func (p *cmdProvider) Run() error {
if len(p.command) == 1 {
p.cmd = exec.Command(p.command[0])
} else if len(p.command) > 1 {
c := p.command[0]
args := p.command[1:]
p.cmd = exec.Command(c, args...)
} else if len(p.command) == 0 {
panic("Command length should be at least 1!")
}
p.cmd.Dir = p.WorkingDir()
env := map[string]string{
"TUNASYNC_MIRROR_NAME": p.Name(),
"TUNASYNC_WORKING_DIR": p.WorkingDir(),
@@ -91,14 +59,14 @@ func (p *cmdProvider) Run() error {
for k, v := range p.env {
env[k] = v
}
p.cmd.Env = newEnviron(env, true)
p.cmd = newCmdJob(p.command, p.WorkingDir(), env)
logFile, err := os.OpenFile(p.LogFile(), os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
return err
}
p.cmd.Stdout = logFile
p.cmd.Stderr = logFile
// defer logFile.Close()
p.cmd.SetLogFile(logFile)
return p.cmd.Start()
}
@@ -107,9 +75,12 @@ func (p *cmdProvider) Wait() error {
return p.cmd.Wait()
}
// TODO: implement this
func (p *cmdProvider) Terminate() {
func (p *cmdProvider) Terminate() error {
if p.cmd == nil {
return errors.New("provider command job not initialized")
}
err := p.cmd.Terminate()
return err
}
// TODO: implement this