diff --git a/tapeserver/daemon/DriveHandler.cpp b/tapeserver/daemon/DriveHandler.cpp
index 8ac6ec89f2f7623e1d38b6bc6ca3ed812b768075..7aacd5443109a44436a850820836b7821b2db681 100644
--- a/tapeserver/daemon/DriveHandler.cpp
+++ b/tapeserver/daemon/DriveHandler.cpp
@@ -202,6 +202,11 @@ void DriveHandler::kill() {
   params.add("unitName", m_configLine.unitName);
   if (m_pid != -1) {
     params.add("SubProcessId", m_pid);
+    // The socket pair will be reopened on the next fork. Clean it up.
+    if (m_socketPair.get()) {
+      m_processManager.removeFile(m_socketPair->getFdForAccess(server::SocketPair::Side::child));
+      m_socketPair.reset(nullptr);
+    }
     try {
       exception::Errnum::throwOnMinusOne(::kill(m_pid, SIGKILL),"Failed to kill() subprocess");
       int status;
@@ -565,6 +570,11 @@ SubprocessHandler::ProcessingStatus DriveHandler::processSigChild() {
     // It was our process. In all cases we prepare the space for the new session
     // We did collect the exit code of our child process
     // How well did it finish? (exit() or killed?)
+    // The socket pair will be reopened on the next fork. Clean it up.
+    if (m_socketPair.get()) {
+      m_processManager.removeFile(m_socketPair->getFdForAccess(server::SocketPair::Side::child));
+      m_socketPair.reset(nullptr);
+    }
     cta::log::ScopedParamContainer params(m_processManager.logContext());
     params.add("pid", m_pid)
           .add("driveUnit", m_configLine.unitName);