프로세스 재시작 지원
This commit is contained in:
@ -274,15 +274,22 @@ func NewClient() (HoustonClient, error) {
|
||||
var newprocs []*procmeta
|
||||
for _, proc := range hc.childProcs {
|
||||
if proc.cmd == exited {
|
||||
if proc.state == protos.ProcessState_Running {
|
||||
go func(cmd *exec.Cmd) {
|
||||
if err := cmd.Process.Signal(syscall.SIGTERM); err != nil {
|
||||
cmd.Process.Signal(os.Kill)
|
||||
if proc.state == protos.ProcessState_Running || proc.state == protos.ProcessState_Restart {
|
||||
go func(proc *procmeta) {
|
||||
if err := proc.cmd.Process.Signal(syscall.SIGTERM); err != nil {
|
||||
proc.cmd.Process.Signal(os.Kill)
|
||||
}
|
||||
cmd.Wait()
|
||||
cmd.Process.Release()
|
||||
logger.Println("abnormal termination of process :", cmd.Args)
|
||||
}(proc.cmd)
|
||||
proc.cmd.Wait()
|
||||
proc.cmd.Process.Release()
|
||||
|
||||
if proc.state == protos.ProcessState_Restart {
|
||||
hc.startChildProcess(&shared.StartProcessRequest{
|
||||
Version: proc.version,
|
||||
Name: proc.name,
|
||||
Args: proc.cmd.Args,
|
||||
}, op)
|
||||
}
|
||||
}(proc)
|
||||
}
|
||||
} else {
|
||||
newprocs = append(newprocs, proc)
|
||||
|
||||
@ -12,7 +12,6 @@ import (
|
||||
"os/exec"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"runtime/debug"
|
||||
"strings"
|
||||
"syscall"
|
||||
@ -165,33 +164,17 @@ func zipLogFiles(storageRoot string, req *shared.UploadRequest, start, except st
|
||||
}
|
||||
|
||||
func prepareProcessLaunch(storageRoot string, req *shared.StartProcessRequest) *procmeta {
|
||||
re := regexp.MustCompile(`[^\s"']+|"([^"]*)"|'([^']*)`)
|
||||
argsTemp := re.FindAllString(req.Args, -1)
|
||||
var args []string
|
||||
for _, arg := range argsTemp {
|
||||
if strings.HasPrefix(arg, `"`) && len(args) > 0 {
|
||||
lastarg := args[len(args)-1]
|
||||
if strings.HasSuffix(lastarg, "=") {
|
||||
args[len(args)-1] = lastarg + arg
|
||||
} else {
|
||||
args = append(args, arg)
|
||||
}
|
||||
} else {
|
||||
args = append(args, arg)
|
||||
}
|
||||
}
|
||||
|
||||
if len(args) == 0 {
|
||||
if len(req.Args) == 0 {
|
||||
return nil
|
||||
}
|
||||
verpath := path.Join(storageRoot, req.Name, req.Version)
|
||||
fi, err := os.Stat(verpath)
|
||||
|
||||
if err == nil && fi.IsDir() {
|
||||
args[0] = "./" + path.Clean(strings.TrimPrefix(args[0], "/"))
|
||||
os.Chmod(path.Join(verpath, args[0]), 0777)
|
||||
req.Args[0] = "./" + path.Clean(strings.TrimPrefix(req.Args[0], "/"))
|
||||
os.Chmod(path.Join(verpath, req.Args[0]), 0777)
|
||||
|
||||
cmd := exec.Command(args[0], args[1:]...)
|
||||
cmd := exec.Command(req.Args[0], req.Args[1:]...)
|
||||
cmd.Dir = verpath
|
||||
stdin, _ := cmd.StdinPipe()
|
||||
|
||||
@ -462,27 +445,17 @@ func (hc *houstonClient) restartChildProcess(req *shared.RestartProcessRequest,
|
||||
}
|
||||
}
|
||||
|
||||
proc.state = protos.ProcessState_Restart
|
||||
op.Refresh(context.Background(), hc.makeOperationQueryRequest())
|
||||
|
||||
if err := proc.cmd.Process.Signal(syscall.SIGTERM); err != nil {
|
||||
proc.cmd.Process.Signal(os.Kill)
|
||||
}
|
||||
proc.state = protos.ProcessState_Stopping
|
||||
proc.cmd.Wait()
|
||||
proc.cmd.Process.Release()
|
||||
op.Refresh(context.Background(), hc.makeOperationQueryRequest())
|
||||
|
||||
proc.state = protos.ProcessState_Stopped
|
||||
op.Refresh(context.Background(), hc.makeOperationQueryRequest())
|
||||
|
||||
if err := hc.launch(proc); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
op.Refresh(context.Background(), hc.makeOperationQueryRequest())
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user