diff options
author | Matthew Heon <matthew.heon@pm.me> | 2019-07-10 14:43:07 -0400 |
---|---|---|
committer | Matthew Heon <mheon@redhat.com> | 2019-07-17 16:48:38 -0400 |
commit | 156b6ef22230b296a06b50196e0191d191e15749 (patch) | |
tree | 43520eacaa705e26c4744fe1c8e1a330589b9cd9 /libpod/oci_linux.go | |
parent | 1e3e99f2fe95c8679f8962b8175038bd7d0558f2 (diff) | |
download | podman-156b6ef22230b296a06b50196e0191d191e15749.tar.gz podman-156b6ef22230b296a06b50196e0191d191e15749.tar.bz2 podman-156b6ef22230b296a06b50196e0191d191e15749.zip |
Properly retrieve Conmon PID
Our previous method (just read the PID that we spawned) doesn't
work - Conmon double-forks to daemonize, so we end up with a PID
pointing to the first process, which dies almost immediately.
Reading from the PID file gets us the real PID.
Signed-off-by: Matthew Heon <matthew.heon@pm.me>
Diffstat (limited to 'libpod/oci_linux.go')
-rw-r--r-- | libpod/oci_linux.go | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/libpod/oci_linux.go b/libpod/oci_linux.go index 044373ec5..1182457f4 100644 --- a/libpod/oci_linux.go +++ b/libpod/oci_linux.go @@ -11,6 +11,7 @@ import ( "os/exec" "path/filepath" "runtime" + "strconv" "strings" "syscall" "time" @@ -461,8 +462,21 @@ func (r *OCIRuntime) createOCIContainer(ctr *Container, cgroupParent string, res return errors.Wrapf(define.ErrInternal, "container create failed") } ctr.state.PID = ss.si.Pid - if cmd.Process != nil { - ctr.state.ConmonPID = cmd.Process.Pid + // Let's try reading the Conmon pid at the same time. + if ctr.config.ConmonPidFile != "" { + contents, err := ioutil.ReadFile(ctr.config.ConmonPidFile) + if err != nil { + logrus.Warnf("Error reading Conmon pidfile for container %s: %v", ctr.ID(), err) + } else { + // Convert it to an int + conmonPID, err := strconv.Atoi(string(contents)) + if err != nil { + logrus.Warnf("Error decoding Conmon PID %q for container %s: %v", string(contents), ctr.ID(), err) + } else { + ctr.state.ConmonPID = conmonPID + logrus.Infof("Got Conmon PID as %d", conmonPID) + } + } } case <-time.After(ContainerCreateTimeout): return errors.Wrapf(define.ErrInternal, "container creation timeout") |