runsc: `runsc wait` print wait status.
PiperOrigin-RevId: 203160639 Change-Id: I8fb2787ba0efb7eacd9d4c934238a26eb5ae79d5
This commit is contained in:
parent
0ef6066167
commit
138cb8da50
|
@ -15,6 +15,8 @@
|
||||||
package cmd
|
package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"os"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"context"
|
"context"
|
||||||
|
@ -75,7 +77,7 @@ func (wt *Wait) Execute(_ context.Context, f *flag.FlagSet, args ...interface{})
|
||||||
Fatalf("error loading container: %v", err)
|
Fatalf("error loading container: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
waitStatus := args[1].(*syscall.WaitStatus)
|
var waitStatus syscall.WaitStatus
|
||||||
switch {
|
switch {
|
||||||
// Wait on the whole container.
|
// Wait on the whole container.
|
||||||
case wt.rootPID == unsetPID && wt.pid == unsetPID:
|
case wt.rootPID == unsetPID && wt.pid == unsetPID:
|
||||||
|
@ -83,21 +85,43 @@ func (wt *Wait) Execute(_ context.Context, f *flag.FlagSet, args ...interface{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Fatalf("error waiting on container %q: %v", c.ID, err)
|
Fatalf("error waiting on container %q: %v", c.ID, err)
|
||||||
}
|
}
|
||||||
*waitStatus = ws
|
waitStatus = ws
|
||||||
// Wait on a PID in the root PID namespace.
|
// Wait on a PID in the root PID namespace.
|
||||||
case wt.rootPID != unsetPID:
|
case wt.rootPID != unsetPID:
|
||||||
ws, err := c.WaitRootPID(int32(wt.rootPID))
|
ws, err := c.WaitRootPID(int32(wt.rootPID))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Fatalf("error waiting on PID in root PID namespace %d in container %q: %v", wt.rootPID, c.ID, err)
|
Fatalf("error waiting on PID in root PID namespace %d in container %q: %v", wt.rootPID, c.ID, err)
|
||||||
}
|
}
|
||||||
*waitStatus = ws
|
waitStatus = ws
|
||||||
// Wait on a PID in the container's PID namespace.
|
// Wait on a PID in the container's PID namespace.
|
||||||
case wt.pid != unsetPID:
|
case wt.pid != unsetPID:
|
||||||
ws, err := c.WaitPID(int32(wt.pid))
|
ws, err := c.WaitPID(int32(wt.pid))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Fatalf("error waiting on PID %d in container %q: %v", wt.pid, c.ID, err)
|
Fatalf("error waiting on PID %d in container %q: %v", wt.pid, c.ID, err)
|
||||||
}
|
}
|
||||||
*waitStatus = ws
|
waitStatus = ws
|
||||||
|
}
|
||||||
|
result := waitResult{
|
||||||
|
ID: id,
|
||||||
|
ExitStatus: exitStatus(waitStatus),
|
||||||
|
}
|
||||||
|
// Write json-encoded wait result directly to stdout.
|
||||||
|
if err := json.NewEncoder(os.Stdout).Encode(result); err != nil {
|
||||||
|
Fatalf("error marshaling wait result: %v", err)
|
||||||
}
|
}
|
||||||
return subcommands.ExitSuccess
|
return subcommands.ExitSuccess
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type waitResult struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
ExitStatus int `json:"exitStatus"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// exitStatus returns the correct exit status for a process based on if it
|
||||||
|
// was signaled or exited cleanly.
|
||||||
|
func exitStatus(status syscall.WaitStatus) int {
|
||||||
|
if status.Signaled() {
|
||||||
|
return 128 + int(status.Signal())
|
||||||
|
}
|
||||||
|
return status.ExitStatus()
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue