diff --git a/playbooks/roles/zuul-executor/tasks/graceful.yaml b/playbooks/roles/zuul-executor/tasks/graceful.yaml
index 997699169e..a2bca090a6 100644
--- a/playbooks/roles/zuul-executor/tasks/graceful.yaml
+++ b/playbooks/roles/zuul-executor/tasks/graceful.yaml
@@ -1,5 +1,6 @@
 - name: Check if Zuul Executor containers are running
-  # It is possible they are stopped due to some external circumstance
+  # It is possible they are stopped due to some external circumstance.
+  # NOTE: docker-compose ps -q reports exited containers unlike docker ps -q
   command:
     cmd: docker-compose ps -q
     chdir: /etc/zuul-executor
@@ -14,6 +15,11 @@
   become_user: root
   # Only run the docker exec command if a container is running
   when: executor_container_list.stdout_lines | length > 0
+  register: ze_graceful
+  failed_when:
+    - ze_graceful.rc != 0
+    # If the exec fails because the container is not running we continue.
+    - "'is not running' not in ze_graceful.stderr"
 - name: Wait for Zuul Executor to stop
   shell:
     cmd: docker-compose ps -q | xargs docker wait
diff --git a/playbooks/roles/zuul-merger/tasks/graceful.yaml b/playbooks/roles/zuul-merger/tasks/graceful.yaml
index 7c801088f1..233f17c636 100644
--- a/playbooks/roles/zuul-merger/tasks/graceful.yaml
+++ b/playbooks/roles/zuul-merger/tasks/graceful.yaml
@@ -1,5 +1,6 @@
 - name: Check if Zuul merger containers are running
-  # It is possible they are stopped due to some external circumstance
+  # It is possible they are stopped due to some external circumstance.
+  # NOTE: docker-compose ps -q reports exited containers unlike docker ps -q
   command:
     cmd: docker-compose ps -q
     chdir: /etc/zuul-merger
@@ -14,6 +15,18 @@
   become_user: root
   # Only run the docker exec command if a container is running
   when: merger_container_list.stdout_lines | length > 0
+  register: zm_graceful
+  failed_when:
+    - zm_graceful.rc != 0
+    # There is a fun race with docker exec and shutting down the
+    # container running the exec. If the container is stopped while
+    # the exec is running then the command in the exec effectively gets
+    # kill -9'd and the docker exec command rc is 137. Since this
+    # should only happen when the container is stopped we proceed with
+    # the overall graceful shutdown.
+    - zm_graceful.rc != 137
+    # If the exec fails because the container is not running we continue.
+    - "'is not running' not in zm_graceful.stderr"
 - name: Wait for Zuul Merger to stop
   shell:
     cmd: docker-compose ps -q | xargs docker wait