summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2009-07-30 07:29:34 +0000
committerZac Medico <zmedico@gentoo.org>2009-07-30 07:29:34 +0000
commit2c448fe6d4182f4b154f941adabfccbdea2936bc (patch)
treee4e42836fdfd6ffea72c0d6aa86fd2da1105f1cc
parent4928fa94e1f5b247ade11734b432d184a55a322d (diff)
downloadportage-2c448fe6d4182f4b154f941adabfccbdea2936bc.tar.gz
portage-2c448fe6d4182f4b154f941adabfccbdea2936bc.tar.bz2
portage-2c448fe6d4182f4b154f941adabfccbdea2936bc.zip
Bug #278895 - Make ebuild.sh clean up orphaned processes that may have been
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
-rwxr-xr-xbin/ebuild.sh11
-rwxr-xr-xbin/isolated-functions.sh3
-rw-r--r--pym/portage/__init__.py1
3 files changed, 14 insertions, 1 deletions
diff --git a/bin/ebuild.sh b/bin/ebuild.sh
index a20f8d4c9..bd32f85ff 100755
--- a/bin/ebuild.sh
+++ b/bin/ebuild.sh
@@ -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
diff --git a/bin/isolated-functions.sh b/bin/isolated-functions.sh
index 8a7f899b9..8bc6f17fc 100755
--- a/bin/isolated-functions.sh
+++ b/bin/isolated-functions.sh
@@ -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 \
diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py
index d897af0e8..0e279c433 100644
--- a/pym/portage/__init__.py
+++ b/pym/portage/__init__.py
@@ -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"
]