Bug #278895 - Make ebuild.sh clean up orphaned processes that may have been
authorZac Medico <zmedico@gentoo.org>
Thu, 30 Jul 2009 07:29:34 +0000 (07:29 -0000)
committerZac Medico <zmedico@gentoo.org>
Thu, 30 Jul 2009 07:29:34 +0000 (07:29 -0000)
left behind by ebuild phases. This works by using setsid to create a new
login session for the ebuild.sh process, and `kill -s SIGHUP 0` to send
a SIGHUP signal to all processes in the session. The setsid is currently
not done on the python side since that would cause the sandbox process in
the session, and sandbox produces a warning message if it catches a SIGHUP
signal.

svn path=/main/trunk/; revision=13856

bin/ebuild.sh
bin/isolated-functions.sh
pym/portage/__init__.py

index a20f8d4c9367c500b672ff4c8223e7662f27deca..bd32f85ff1829c1aecc346066aa6a3fbfdc54237 100755 (executable)
@@ -71,6 +71,17 @@ PREROOTPATH=${PREROOTPATH%%:}
 PATH=$PORTAGE_BIN_PATH/ebuild-helpers:$PREROOTPATH${PREROOTPATH:+:}/usr/local/sbin:/sbin:/usr/sbin:/usr/local/bin:/bin:/usr/bin${ROOTPATH:+:}$ROOTPATH
 export PATH
 
+if [[ -z $PORTAGE_SETSID && \
+       -n $EBUILD_SH_ARGS && $EBUILD_SH_ARGS != depend ]] ; then
+       if type -P setsid >/dev/null ; then
+               # Use setsid to create a new login session so that we can use SIGHUP
+               # to ensure that no orphaned subprocesses are left running.
+               export PORTAGE_SETSID=1
+               exec setsid "$PORTAGE_BIN_PATH/ebuild.sh" $EBUILD_SH_ARGS
+       fi
+fi
+trap '[[ $PORTAGE_SETSID = 1 ]] && { trap : SIGHUP ; kill -s SIGHUP 0 ; }' EXIT
+
 source "${PORTAGE_BIN_PATH}/isolated-functions.sh"  &>/dev/null
 
 # Set IMAGE for minimal backward compatibility with
index 8a7f899b9535d76d447f35db378fd17dd232d36b..8bc6f17fc8b586019f89c59089375689a2d9fecd 100755 (executable)
@@ -536,7 +536,8 @@ save_ebuild_env() {
                        PORTAGE_DEPCACHEDIR PORTAGE_GID PORTAGE_INST_GID \
                        PORTAGE_INST_UID PORTAGE_LOG_FILE PORTAGE_MASTER_PID \
                        PORTAGE_QUIET \
-                       PORTAGE_REPO_NAME PORTAGE_RESTRICT PORTAGE_UPDATE_ENV \
+                       PORTAGE_REPO_NAME PORTAGE_RESTRICT \
+                       PORTAGE_SETSID PORTAGE_UPDATE_ENV \
                        PORTAGE_VERBOSE PORTAGE_WORKDIR_MODE PORTDIR \
                        PORTDIR_OVERLAY ${!PORTAGE_SANDBOX_*} PREROOTPATH \
                        PROFILE_PATHS PWORKDIR QA_INTERCEPTORS \
index d897af0e8b5f2ece05a50524dc44e8b79c5aa31c..0e279c4331566b2a53b26e0a90f57acb99a3df28 100644 (file)
@@ -1048,6 +1048,7 @@ class config(object):
                "EBUILD_PHASE", "EMERGE_FROM", "HOMEPAGE", "INHERITED", "IUSE",
                "KEYWORDS", "LICENSE", "PDEPEND", "PF", "PKGUSE",
                "PORTAGE_CONFIGROOT", "PORTAGE_IUSE", "PORTAGE_REPO_NAME",
+               "PORTAGE_SETSID",
                "PORTAGE_USE", "PROPERTIES", "PROVIDE", "RDEPEND", "RESTRICT",
                "ROOT", "SLOT", "SRC_URI"
        ]