diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..706fd07 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea +.vscode diff --git a/process.go b/process.go index 11bdef4..53981c9 100644 --- a/process.go +++ b/process.go @@ -28,7 +28,6 @@ type StarCmd struct { errout []byte runerr error exitcode int - customCtx context.Context stdoutBuf *bytes.Buffer stderrBuf *bytes.Buffer stdoutpoint int @@ -314,9 +313,13 @@ func (starcli *StarCmd) ExitCode() int { return starcli.exitcode } -func (starcli *StarCmd) Kill() { - starcli.CMD.Process.Kill() +func (starcli *StarCmd) Kill() error{ + err:=starcli.CMD.Process.Kill() + if err!=nil{ + return err + } starcli.running = false + return nil } func (starcli *StarCmd) GetPid() int { diff --git a/process_unix.go b/process_unix.go index 1fd153c..3b3e193 100644 --- a/process_unix.go +++ b/process_unix.go @@ -283,25 +283,49 @@ func Daemon(path string, args ...string) (int, error) { return pid, err } -func (starcli *StarCmd) SetRunUser(uid, gid uint32) { +func DaemonWithUser(uid, gid uint32,groups []uint32,path string, args ...string) (int, error) { + cmd := exec.Command(path, args...) + cmd.SysProcAttr = &syscall.SysProcAttr{ + Credential: &syscall.Credential{ + Uid: uid, + Gid: gid, + Groups: groups, + }, + Setsid: true, + } + if err := cmd.Start(); err != nil { + return -1, err + } + pid := cmd.Process.Pid + err := cmd.Process.Release() + return pid, err +} + +func (starcli *StarCmd) SetRunUser(uid, gid uint32,groups []uint32) { starcli.CMD.SysProcAttr = &syscall.SysProcAttr{ Credential: &syscall.Credential{ Uid: uid, Gid: gid, + Groups: groups, }, Setsid: true, } } func (starcli *StarCmd) Release() error { - if err := starcli.CMD.Start(); err != nil { - return err + if starcli.CMD.SysProcAttr == nil { + starcli.CMD.SysProcAttr = &syscall.SysProcAttr{ + Setsid: true, + } + } else { + starcli.CMD.SysProcAttr.Setsid = true } - starcli.CMD.SysProcAttr = &syscall.SysProcAttr{ - Setsid: true, + if !starcli.IsRunning() { + if err := starcli.CMD.Start(); err != nil { + return err + } } - starcli.CMD.Process.Release() - return nil + return starcli.CMD.Process.Release() } func (starcli *StarCmd) SetKeepCaps() error { @@ -311,3 +335,11 @@ func (starcli *StarCmd) SetKeepCaps() error { } return nil } + +func SetKeepCaps() error { + _, _, err := syscall.RawSyscall(157 /*SYS PRCTL */, 0x8 /*PR SET KEEPCAPS*/, 1, 0) + if 0 != err { + return err + } + return nil +}