本文整理汇总了Golang中syscall.WaitStatus类的典型用法代码示例。如果您正苦于以下问题:Golang WaitStatus类的具体用法?Golang WaitStatus怎么用?Golang WaitStatus使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了WaitStatus类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: checkForDeath
// checkForDeath tries to clean up zombies and then checks if the
// process group is empty.
//
// It returns "true" if the answer is yes and there are no grace pings left
//
func (n *nelly) checkForDeath() bool {
// Check if there are any zombies to eat. Process.Wait() doesn't
// support the POSIX WNOHANG for portability reasons, so let's use
// the syscall.Wait4() which is POSIX-only.
var w syscall.WaitStatus
rusage := syscall.Rusage{}
zpid, err := syscall.Wait4(-1, &w, syscall.WNOHANG, &rusage)
if err != nil {
n.Error("Error in Wait4: %s", err.Error())
}
if zpid > 0 {
n.Error("Ate a tasty zombie (pid was %d, status was %d)", zpid, w.ExitStatus())
}
if n.processGroupIsEmpty() {
n.startGracePings--
if n.startGracePings <= 0 {
n.Error("Process group [%d] empty - exiting and hoping init sorts it all out", n.pgid)
return true
} else {
n.Error("Process group [%d] empty - grace pings left [%d]", n.pgid, n.startGracePings)
}
} else {
// We've had a good ping, no more Mr Nice Guy
n.startGracePings = 0
}
return false
}
示例2: ExecBash
func ExecBash(command string, args []string) (int, string, error) {
cmd := exec.Command(command, args...)
var waitStatus syscall.WaitStatus
//Stdout buffer
cmdOutput := &bytes.Buffer{}
//Attach buffer to command stdout
cmd.Stdout = cmdOutput
//Execute command
err := cmd.Run()
defer func() {
if r := recover(); r != nil {
fmt.Printf("Command:%s execute error\n", command)
}
}()
if err != nil {
if exitError, ok := err.(*exec.ExitError); ok {
waitStatus = exitError.Sys().(syscall.WaitStatus)
return waitStatus.ExitStatus(), "", err
} else {
fmt.Println("something wrong")
}
}
waitStatus = cmd.ProcessState.Sys().(syscall.WaitStatus)
return waitStatus.ExitStatus(), cmdOutput.String(), nil
}
示例3: IsRunning
func (m *Module) IsRunning() bool {
pid := 0
if m.Name == "internal:shared" {
pid = m.SyncProcess.Pid
} else {
pid = m.MainProcess.Pid
}
var waitstatus syscall.WaitStatus
wpid, err := syscall.Wait4(pid, &waitstatus, syscall.WNOHANG|syscall.WUNTRACED, nil)
if err != nil {
// When would this happen?
log.Println("Unable to get process wait status:", err)
// Assume it is not running
return false
}
// If status is not available, the pid is 0.
if wpid == 0 {
return true
}
if waitstatus.Exited() {
delete(modules, m.Name)
return false
}
return true
}
示例4: babySit
func babySit(process *os.Process) int {
// Forward all signals to the app
sigchan := make(chan os.Signal, 1)
sigutil.CatchAll(sigchan)
go func() {
for sig := range sigchan {
if sig == syscall.SIGCHLD {
continue
}
process.Signal(sig)
}
}()
// Wait for the app to exit. Also, as pid 1 it's our job to reap all
// orphaned zombies.
var wstatus syscall.WaitStatus
for {
pid, err := syscall.Wait4(-1, &wstatus, 0, nil)
if err == nil && pid == process.Pid {
break
}
}
return wstatus.ExitStatus()
}
示例5: Run
func (t *tracerImpl) Run() (err error) {
if t.cmd.SysProcAttr == nil {
t.cmd.SysProcAttr = &syscall.SysProcAttr{Ptrace: true}
} else {
t.cmd.SysProcAttr.Ptrace = true
}
runtime.LockOSThread()
if err = t.cmd.Start(); err != nil {
return
}
var waitStatus syscall.WaitStatus
if _, err = syscall.Wait4(t.cmd.Process.Pid, &waitStatus, 0, nil); err != nil {
return
}
if waitStatus.Exited() {
return
}
// Set options to detect our syscalls
if err = syscall.PtraceSetOptions(t.cmd.Process.Pid, syscall.PTRACE_O_TRACESYSGOOD); err != nil {
return
}
var regsEntry, regsExit syscall.PtraceRegs
// Get first syscall
if err = syscall.PtraceGetRegs(t.cmd.Process.Pid, ®sEntry); err != nil {
return
}
var exited bool
for {
if exited, err = wait_for_syscall(t.cmd.Process.Pid); exited || err != nil {
return
}
// Get syscall info
if err = syscall.PtraceGetRegs(t.cmd.Process.Pid, ®sEntry); err != nil {
return
}
// Enter syscall
t.callback(regsEntry, false)
if exited, err = wait_for_syscall(t.cmd.Process.Pid); exited || err != nil {
return
}
// Get syscall returned value
if err = syscall.PtraceGetRegs(t.cmd.Process.Pid, ®sExit); err != nil {
return
}
t.callback(regsExit, true)
}
}
示例6: babySit
func babySit(process *os.Process) int {
log := logger.New("fn", "babySit")
// Forward all signals to the app
sigchan := make(chan os.Signal, 1)
sigutil.CatchAll(sigchan)
go func() {
for sig := range sigchan {
log.Info("received signal", "type", sig)
if sig == syscall.SIGCHLD {
continue
}
log.Info("forwarding signal to command", "type", sig)
process.Signal(sig)
}
}()
// Wait for the app to exit. Also, as pid 1 it's our job to reap all
// orphaned zombies.
var wstatus syscall.WaitStatus
for {
pid, err := syscall.Wait4(-1, &wstatus, 0, nil)
if err == nil && pid == process.Pid {
break
}
}
if wstatus.Signaled() {
log.Info("command exited due to signal")
return 0
}
return wstatus.ExitStatus()
}
示例7: ConvertOfficeDocToPdf2
func ConvertOfficeDocToPdf2(file string) {
args := []string{"-f", "pdf",
"-eSelectPdfVersion=1",
"-eReduceImageResolution=true",
"-eMaxImageResolution=300",
"-p",
"8200",
"-o",
"~/foo1.pdf",
"~/foo.pptx",
}
cmd := exec.Command("unoconv", args...)
var waitStatus syscall.WaitStatus
if err := cmd.Run(); err != nil {
//fmt.Printf("Error:", err)
// Did the command fail because of an unsuccessful exit code
if exitError, ok := err.(*exec.ExitError); ok {
waitStatus = exitError.Sys().(syscall.WaitStatus)
fmt.Printf("Failed: %d", waitStatus.ExitStatus())
}
} else {
// Command was successful
waitStatus = cmd.ProcessState.Sys().(syscall.WaitStatus)
fmt.Printf("Success: %d", waitStatus.ExitStatus())
}
}
示例8: Shell
func Shell(f string, v ...interface{}) (retCode int, stdout, stderr string) {
var so, se bytes.Buffer
command := exec.Command("bash", "-c", fmt.Sprintf(f, v...))
command.Stdout = &so
command.Stderr = &se
var waitStatus syscall.WaitStatus
if err := command.Run(); err != nil {
if exitError, ok := err.(*exec.ExitError); ok {
waitStatus = exitError.Sys().(syscall.WaitStatus)
retCode = waitStatus.ExitStatus()
} else {
// looks like a system error, for example, IO error
panic(err)
}
} else {
waitStatus = command.ProcessState.Sys().(syscall.WaitStatus)
retCode = waitStatus.ExitStatus()
}
stdout = string(so.Bytes())
stderr = string(se.Bytes())
return
}
示例9: reap
func (p *ProcessReaper) reap() {
for {
p.log.Debug("reap")
var status syscall.WaitStatus
var rusage syscall.Rusage
wpid, err := p.wait4(-1, &status, syscall.WNOHANG, &rusage)
if wpid == 0 || (wpid == -1 && err.Error() == "no child processes") {
break
}
if err != nil {
p.log.Error("reaper-wait-error", err, lager.Data{"wpid": wpid})
break
}
p.log.Info("reaped", lager.Data{"pid": wpid, "status": status, "rusage": rusage})
if ch, ok := p.waitChan(wpid); p.monitoredPids[wpid] && ok {
ch <- status.ExitStatus()
p.unmonitorPid(wpid)
p.log.Info("wait-once-sent-exit-status", lager.Data{"pid": wpid, "status": status, "rusage": rusage})
} else {
p.log.Info("wait-once-not-found", lager.Data{"pid": wpid, "status": status, "rusage": rusage})
}
}
}
示例10: Reap
// Called on running checks, to determine if they have finished
// running.
//
// If the Check has not finished executing, returns false.
//
// If the Check has been running for longer than its Timeout,
// a SIGTERM (and failing that a SIGKILL) is issued to forcibly
// terminate the rogue Check process. In either case, this returns
// as if the check has not yet finished, and Reap() will need to be
// called again to fully reap the Check
//
// If the Check has finished execution (on its own, or via forced
// termination), it will return true.
//
// Once complete, some additional meta-stats for the check execution
// are appended to the check output, to be submit up to bolo
func (self *Check) Reap() bool {
pid := self.process.Process.Pid
var ws syscall.WaitStatus
status, err := syscall.Wait4(pid, &ws, syscall.WNOHANG, nil)
if err != nil {
log.Error("Error waiting on check %s[%d]: %s", self.Name, pid, err.Error())
return false
}
if status == 0 {
// self to see if we need to sigkill due to failed sigterm
if time.Now().After(self.started_at.Add(time.Duration(self.Timeout+2) * time.Second)) {
log.Warn("Check %s[%d] has been running too long, sending SIGKILL", self.Name, pid)
if err := syscall.Kill(pid, syscall.SIGKILL); err != nil {
log.Error("Error sending SIGKILL to check %s[%d]: %s", self.Name, pid, err.Error())
}
self.sig_kill = true
}
// self to see if we need to sigterm due to self timeout expiry
if !self.sig_kill && time.Now().After(self.started_at.Add(time.Duration(self.Timeout)*time.Second)) {
log.Warn("Check %s[%d] has been running too long, sending SIGTERM", self.Name, pid)
if err := syscall.Kill(pid, syscall.SIGTERM); err != nil {
log.Error("Error sending SIGTERM to check %s[%d]: %s", self.Name, pid, err.Error())
}
self.sig_term = true
}
return false
}
self.ended_at = time.Now()
self.running = false
self.duration = time.Since(self.started_at)
self.latency = self.started_at.Sub(self.next_run)
self.output = string(self.stdout.Bytes())
self.err_msg = string(self.stderr.Bytes())
if ws.Exited() {
self.rc = ws.ExitStatus()
} else {
log.Debug("Check %s[%d] exited abnormally (signaled/stopped). Setting rc to UNKNOWN", self.Name, pid)
self.rc = UNKNOWN
}
if self.rc > UNKNOWN {
log.Debug("Check %s[%d] returned with an invalid exit code. Setting rc to UNKOWN", self.Name, pid)
self.rc = UNKNOWN
}
self.reschedule()
if self.ended_at.After(self.next_run) {
timeout_triggered := "not reached"
if self.sig_term || self.sig_kill {
timeout_triggered = "reached"
}
log.Warn("Check %s[%d] took %0.3f seconds to run, at interval %d (timeout of %d was %s)",
self.Name, pid, self.duration.Seconds(), self.Every, self.Timeout, timeout_triggered)
}
return true
}
示例11: GetCommandExitCode
func GetCommandExitCode(err error) int {
var waitStatus syscall.WaitStatus
if exitError, ok := err.(*exec.ExitError); ok {
waitStatus = exitError.Sys().(syscall.WaitStatus)
return waitStatus.ExitStatus()
}
return 0
}
示例12: Start
func (proc *Proc) Start() (safeExit bool, err error) {
log.Printf("supervisor running command: %s\n", proc.command)
commandParts := strings.Fields(proc.command)
commandString := commandParts[0]
commandArgs := commandParts[1:len(commandParts)]
proc.cmd = exec.Command(commandString, commandArgs...)
proc.cmd.Stdout = os.Stdout
proc.cmd.Stderr = os.Stderr
proc.AddSignalHandlers()
cmdErr := proc.cmd.Start()
if cmdErr != nil {
log.Fatal(cmdErr)
}
done := make(chan error, 1)
go func() {
done <- proc.cmd.Wait()
}()
//process waits here
exitCode := <-done
if exitCode != nil {
// Type Assertion of exitCode with exec.ExitError struct
var waitStatus syscall.WaitStatus
exitError, ok := exitCode.(*exec.ExitError)
if ok {
// exitError.Sys() returns system specific exit info
// Type Assertion of exitError.Sys() to sysCall.Waitstatus for Unix
waitStatus = exitError.Sys().(syscall.WaitStatus)
exitStatus := waitStatus.ExitStatus()
if exitStatus == 130 {
log.Printf("Process killed manually, aborting restart \n")
return true, nil
} else {
proc.exitCode = exitStatus
proc.procError = fmt.Sprintf("%v", exitCode)
log.Printf("%v", proc.procError)
if proc.restartCount < proc.maxRestartCount {
log.Printf("Restarting app, Restart count %d, Max restart count %d", proc.restartCount, proc.maxRestartCount)
proc.restartCount += 1
proc.Start()
} else {
log.Printf("Max restart count (%d) reached, exiting", proc.maxRestartCount)
log.Printf("--------- Command exited ----------- \n")
}
}
}
} else {
// command exited successfully with return code = 0
proc.exitCode = 0
proc.restartCount += 1
proc.Start()
}
return true, nil
}
示例13: ExitCode
// ExitCode returns the exit code of the command denoted by this struct
func (pr *ProcessResult) ExitCode() int {
var waitStatus syscall.WaitStatus
if exitError, ok := pr.ProcessError.(*exec.ExitError); ok {
waitStatus = exitError.Sys().(syscall.WaitStatus)
} else {
waitStatus = pr.ProcessState.Sys().(syscall.WaitStatus)
}
return waitStatus.ExitStatus()
}
示例14: handleChildExit
func (d *daemonState) handleChildExit(pid int, wstatus syscall.WaitStatus) {
d.Debug("Child process pid=%d exited from daemon with status %d", pid, wstatus.ExitStatus())
for _, sbox := range d.sandboxes {
if sbox.init.Process.Pid == pid {
sbox.remove(d.log)
return
}
}
d.Notice("No sandbox found with oz-init pid = %d", pid)
}
示例15: run
func run() int {
flag.Parse()
runtime := flag.Args()[1] // e.g. runc
dir := flag.Args()[2] // bundlePath for run, processPath for exec
containerId := flag.Args()[3]
signals := make(chan os.Signal, 100)
signal.Notify(signals, syscall.SIGCHLD)
fd3 := os.NewFile(3, "/proc/self/fd/3")
logFile := fmt.Sprintf("/proc/%d/fd/4", os.Getpid())
logFD := os.NewFile(4, "/proc/self/fd/4")
syncPipe := os.NewFile(5, "/proc/self/fd/5")
pidFilePath := filepath.Join(dir, "pidfile")
stdin, stdout, stderr, winsz := openPipes(dir)
syncPipe.Write([]byte{0})
var runcStartCmd *exec.Cmd
if *tty {
ttySlave := setupTty(stdin, stdout, pidFilePath, winsz, garden.WindowSize{Rows: *rows, Columns: *cols})
runcStartCmd = exec.Command(runtime, "-debug", "-log", logFile, "exec", "-d", "-tty", "-console", ttySlave.Name(), "-p", fmt.Sprintf("/proc/%d/fd/0", os.Getpid()), "-pid-file", pidFilePath, containerId)
} else {
runcStartCmd = exec.Command(runtime, "-debug", "-log", logFile, "exec", "-p", fmt.Sprintf("/proc/%d/fd/0", os.Getpid()), "-d", "-pid-file", pidFilePath, containerId)
runcStartCmd.Stdin = stdin
runcStartCmd.Stdout = stdout
runcStartCmd.Stderr = stderr
}
// we need to be the subreaper so we can wait on the detached container process
system.SetSubreaper(os.Getpid())
if err := runcStartCmd.Start(); err != nil {
fd3.Write([]byte{2})
return 2
}
var status syscall.WaitStatus
var rusage syscall.Rusage
_, err := syscall.Wait4(runcStartCmd.Process.Pid, &status, 0, &rusage)
check(err) // Start succeeded but Wait4 failed, this can only be a programmer error
logFD.Close() // No more logs from runc so close fd
fd3.Write([]byte{byte(status.ExitStatus())})
if status.ExitStatus() != 0 {
return 3 // nothing to wait for, container didn't launch
}
containerPid, err := parsePid(pidFilePath)
check(err)
return waitForContainerToExit(dir, containerPid, signals)
}