diff --git a/pkg/domain/infra/abi/terminal/terminal_common.go b/pkg/domain/infra/abi/terminal/terminal_common.go index 3dbdfc9560..f9a012b7d2 100644 --- a/pkg/domain/infra/abi/terminal/terminal_common.go +++ b/pkg/domain/infra/abi/terminal/terminal_common.go @@ -84,11 +84,13 @@ func StartAttachCtr(ctx context.Context, ctr *libpod.Container, stdout, stderr, streams.AttachInput = false } - if !startContainer { - if sigProxy { - ProxySignals(ctr) - } + if sigProxy { + // To prevent a race condition, install the signal handler + // before starting/attaching to the container. + ProxySignals(ctr) + } + if !startContainer { return ctr.Attach(streams, detachKeys, resize) } @@ -97,10 +99,6 @@ func StartAttachCtr(ctx context.Context, ctr *libpod.Container, stdout, stderr, return err } - if sigProxy { - ProxySignals(ctr) - } - if stdout == nil && stderr == nil { fmt.Printf("%s\n", ctr.ID()) } diff --git a/test/system/032-sig-proxy.bats b/test/system/032-sig-proxy.bats index 422f0cae6b..9f4047e15d 100644 --- a/test/system/032-sig-proxy.bats +++ b/test/system/032-sig-proxy.bats @@ -3,7 +3,14 @@ load helpers # Command to run in each of the tests. -SLEEPLOOP='trap "echo BYE;exit 0" INT;echo READY;while :;do sleep 0.1;done' +SLEEPLOOP='trap "echo BYE;exit 0" INT;echo READY;while :;do echo RUNNING;sleep 0.1;done' + +function setup() { + basic_setup + + TESTLOG=$PODMAN_TMPDIR/container-stdout +} + # Main test code: wait for container to exist and be ready, send it a # signal, wait for container to acknowledge and exit. @@ -26,8 +33,21 @@ function _test_sigproxy() { fi done - # Now that container exists, wait for it to declare itself READY - wait_for_ready $cname + # Now that container exists, wait for it to declare itself RUNNING + timeout=10 + while :;do + sleep 0.5 + if grep -q RUNNING $TESTLOG; then + break + fi + timeout=$((timeout - 1)) + if [[ $timeout -eq 0 ]]; then + run_podman ps -a + echo "log from container:" + cat $TESTLOG + die "Timed out waiting for container $cname to start" + fi + done # Signal, and wait for container to exit kill -INT $kidpid @@ -52,7 +72,7 @@ function _test_sigproxy() { @test "podman sigproxy test: run" { # We're forced to use $PODMAN because run_podman cannot be backgrounded - $PODMAN run -i --name c_run $IMAGE sh -c "$SLEEPLOOP" & + $PODMAN run -i --name c_run $IMAGE sh -c "$SLEEPLOOP" >$TESTLOG & local kidpid=$! _test_sigproxy c_run $kidpid @@ -62,7 +82,7 @@ function _test_sigproxy() { run_podman create --name c_start $IMAGE sh -c "$SLEEPLOOP" # See above comments regarding $PODMAN and backgrounding - $PODMAN start --attach c_start & + $PODMAN start --attach c_start >$TESTLOG & local kidpid=$! _test_sigproxy c_start $kidpid @@ -72,7 +92,7 @@ function _test_sigproxy() { run_podman run -d --name c_attach $IMAGE sh -c "$SLEEPLOOP" # See above comments regarding $PODMAN and backgrounding - $PODMAN attach c_attach & + $PODMAN attach c_attach >$TESTLOG & local kidpid=$! _test_sigproxy c_attach $kidpid