diff --git a/guix-jupyter-kernel.scm b/guix-jupyter-kernel.scm
index e8df84669157108ecfba9c04adbf7942a555cb24..2200b8198c103d7acf50d37eb1dda4601b31421a 100644
--- a/guix-jupyter-kernel.scm
+++ b/guix-jupyter-kernel.scm
@@ -91,7 +91,16 @@
 was already an inferior associated with STATE, close it."
   (let ((previous (proxy-state-inferior state)))
     (when previous
+      ;; XXX: 'close-inferior' sometimes isn't enough and it ends up being
+      ;; blocked in waitpid(2) (from 'close-pipe') while the inferior is
+      ;; stuck in read(2).  Thus, forcefully terminate PREVIOUS beforehand.
+      ;; This leads to an 'inferior-eval' exception because the inferior
+      ;; doesn't respond, which we catch.
+      (false-if-exception
+       (inferior-eval '(primitive-exit 0) previous))
+
       (close-inferior previous))
+
     (set-proxy-state-property state %inferior-property
                               inferior)))