프로세스 재시작 지원

This commit is contained in:
2023-06-27 09:44:56 +09:00
parent 72e94ccfc3
commit 01b4782e78
7 changed files with 68 additions and 61 deletions

View File

@ -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)

View File

@ -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
}

View File

@ -27,7 +27,8 @@ enum ProcessState {
Stopped = 0;
Stopping = 1;
Running = 2;
Error = 3;
Restart = 3;
Error = 4;
}
message ProcessDescription {

View File

@ -9,6 +9,7 @@ import (
"net/http"
"os"
"path"
"regexp"
"strconv"
"strings"
"time"
@ -294,7 +295,7 @@ func (h *houstonHandler) StartProcess(w http.ResponseWriter, r *http.Request) {
// </form>
name := r.FormValue("name")
version := r.FormValue("version")
args := r.FormValue("args")
argsline := r.FormValue("args")
traws := r.FormValue("targets")
var targets []string
@ -311,6 +312,27 @@ func (h *houstonHandler) StartProcess(w http.ResponseWriter, r *http.Request) {
return
}
re := regexp.MustCompile(`[^\s"']+|"([^"]*)"|'([^']*)`)
argsTemp := re.FindAllString(argsline, -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 {
w.WriteHeader(http.StatusBadRequest)
return
}
h.Operation().StartProcess(MakeStartProcessRequest(shared.StartProcessRequest{
Name: name,
Version: version,

View File

@ -157,10 +157,10 @@ func (h *houstonHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
var operation string
if r.Method == "POST" {
operation = r.FormValue("operation")
logger.Println("api called :", userinfo, r.Form)
logger.Println("api called :", userinfo["email"], r.Form)
} else {
operation = r.URL.Query().Get("operation")
logger.Println("api called :", userinfo, r.URL.Query())
logger.Println("api called :", userinfo["email"], r.URL.Query())
}
if len(operation) == 0 {

View File

@ -35,7 +35,7 @@ type WithdrawRequest struct {
type StartProcessRequest struct {
Name string
Version string
Args string
Args []string
}
type StopProcessRequest struct {

View File

@ -26,7 +26,8 @@ const (
ProcessState_Stopped ProcessState = 0
ProcessState_Stopping ProcessState = 1
ProcessState_Running ProcessState = 2
ProcessState_Error ProcessState = 3
ProcessState_Restart ProcessState = 3
ProcessState_Error ProcessState = 4
)
// Enum value maps for ProcessState.
@ -35,13 +36,15 @@ var (
0: "Stopped",
1: "Stopping",
2: "Running",
3: "Error",
3: "Restart",
4: "Error",
}
ProcessState_value = map[string]int32{
"Stopped": 0,
"Stopping": 1,
"Running": 2,
"Error": 3,
"Restart": 3,
"Error": 4,
}
)
@ -422,20 +425,21 @@ var file_protos_operation_proto_rawDesc = []byte{
0x37, 0x0a, 0x09, 0x41, 0x72, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,
0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14,
0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76,
0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x41, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x63,
0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x4e, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x63,
0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x74, 0x6f, 0x70,
0x70, 0x65, 0x64, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x74, 0x6f, 0x70, 0x70, 0x69, 0x6e,
0x67, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x10, 0x02,
0x12, 0x09, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x03, 0x32, 0x78, 0x0a, 0x09, 0x4f,
0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72,
0x79, 0x12, 0x16, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65,
0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x4f, 0x70, 0x65, 0x72,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x66, 0x72,
0x65, 0x73, 0x68, 0x12, 0x16, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51,
0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x06, 0x2e, 0x45, 0x6d,
0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x0f, 0x5a, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x12, 0x0b, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x10, 0x03, 0x12, 0x09, 0x0a,
0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x04, 0x32, 0x78, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x16,
0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52,
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68,
0x12, 0x16, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72,
0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x06, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79,
0x22, 0x00, 0x42, 0x0f, 0x5a, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (