diff --git a/src/ae.cpp b/src/ae.cpp index efd9b0cb1..5399b3967 100644 --- a/src/ae.cpp +++ b/src/ae.cpp @@ -808,3 +808,11 @@ int aeThreadOwnsLock() { return g_lock.fOwnLock(); } + +void aeClosePipesForForkChild(aeEventLoop *el) +{ + close(el->fdCmdRead); + el->fdCmdRead = -1; + close(el->fdCmdWrite); + el->fdCmdWrite = -1; +} \ No newline at end of file diff --git a/src/ae.h b/src/ae.h index 780083da8..9e7704703 100644 --- a/src/ae.h +++ b/src/ae.h @@ -161,6 +161,7 @@ int aeGetSetSize(aeEventLoop *eventLoop); aeEventLoop *aeGetCurrentEventLoop(); int aeResizeSetSize(aeEventLoop *eventLoop, int setsize); void aeSetDontWait(aeEventLoop *eventLoop, int noWait); +void aeClosePipesForForkChild(aeEventLoop *eventLoop); void setAeLockSetThreadSpinWorker(spin_worker worker); void aeAcquireLock(); diff --git a/src/sentinel.cpp b/src/sentinel.cpp index 2a8dfd739..c879f235d 100644 --- a/src/sentinel.cpp +++ b/src/sentinel.cpp @@ -878,6 +878,10 @@ void sentinelRunPendingScripts(void) { } else if (pid == 0) { /* Child */ tlsCleanup(); + for (int iel = 0; iel < cserver.cthreads; ++iel) { + aeClosePipesForForkChild(g_pserver->rgthreadvar[iel].el); + } + aeClosePipesForForkChild(g_pserver->modulethreadvar.el); execve(sj->argv[0],sj->argv,environ); /* If we are here an error occurred. */ _exit(2); /* Don't retry execution. */ diff --git a/src/server.cpp b/src/server.cpp index 5b481667d..3d5c70faa 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -6192,6 +6192,11 @@ void closeChildUnusedResourceAfterFork() { if (g_pserver->cluster_enabled && g_pserver->cluster_config_file_lock_fd != -1) close(g_pserver->cluster_config_file_lock_fd); /* don't care if this fails */ + for (int iel = 0; iel < cserver.cthreads; ++iel) { + aeClosePipesForForkChild(g_pserver->rgthreadvar[iel].el); + } + aeClosePipesForForkChild(g_pserver->modulethreadvar.el); + /* Clear cserver.pidfile, this is the parent pidfile which should not * be touched (or deleted) by the child (on exit / crash) */ zfree(cserver.pidfile);