mirror of https://github.com/dnomd343/XProxy.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
1.6 KiB
83 lines
1.6 KiB
package process
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"sync"
|
|
)
|
|
|
|
const (
|
|
Ready = iota // process ready to start
|
|
Running // process is running for now
|
|
Death // process exited and waiting for restart
|
|
Stopped // process has been stopped
|
|
)
|
|
|
|
type Process struct {
|
|
name string
|
|
args []string
|
|
envs []string
|
|
mutex sync.Mutex
|
|
proc *exec.Cmd
|
|
status int
|
|
}
|
|
|
|
func NewDaemon(name string, command []string, env map[string]string) *Process {
|
|
fmt.Printf("Create new daemon task %s -> %v %v\n", name, command, env)
|
|
var envs []string
|
|
for k, v := range env {
|
|
envs = append(envs, fmt.Sprintf("%s=%s", k, v))
|
|
}
|
|
return &Process{
|
|
name: name,
|
|
envs: envs,
|
|
args: command,
|
|
status: Ready,
|
|
}
|
|
}
|
|
|
|
func (p *Process) boot() bool {
|
|
p.proc = exec.Command(p.args[0], p.args[1:]...)
|
|
p.proc.Stdout = os.Stdout
|
|
p.proc.Stderr = os.Stderr
|
|
if len(p.envs) != 0 { // with custom env variables
|
|
p.proc.Env = p.envs
|
|
}
|
|
err := p.proc.Start()
|
|
if err != nil {
|
|
fmt.Printf("Failed to boot process %s -> %v\n", p.name, err)
|
|
p.status = Stopped
|
|
return false
|
|
}
|
|
fmt.Printf("Successfully executed process %s -> PID = %d\n", p.name, p.proc.Process.Pid)
|
|
p.status = Running
|
|
return true
|
|
}
|
|
|
|
func (p *Process) wait() {
|
|
for p.proc.ProcessState == nil { // wait until exit
|
|
p.proc.Wait()
|
|
}
|
|
fmt.Printf("Catch process %s exit", p.name)
|
|
}
|
|
|
|
func (p *Process) Start() {
|
|
if !p.mutex.TryLock() {
|
|
fmt.Printf("already running")
|
|
return
|
|
}
|
|
|
|
// TODO: daemon logical
|
|
p.boot()
|
|
p.wait()
|
|
|
|
}
|
|
|
|
func (p *Process) Status() int {
|
|
return p.status
|
|
}
|
|
|
|
func (p *Process) Stop() {
|
|
// TODO: stop daemon and kill process
|
|
}
|
|
|