Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 08 Jun 2012 14:43:47 +0000
From:      scher@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r237310 - soc2012/scher/par_ports/head/Mk
Message-ID:  <20120608144347.79970106564A@hub.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: scher
Date: Fri Jun  8 14:43:46 2012
New Revision: 237310
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=237310

Log:
  [new_feature] correct termination of the whole process tree with
  	background processes starting from parent make process
  
  To terminate the whole process tree, starting from some parent make process (pm_pid)
  one may just use keyboard interrupts in the right terminal (where the make
  process was started) or send signal to internal make script using pkill(1).
  e.g. pkill -P pm_pid
  

Modified:
  soc2012/scher/par_ports/head/Mk/bsd.port.mk

Modified: soc2012/scher/par_ports/head/Mk/bsd.port.mk
==============================================================================
--- soc2012/scher/par_ports/head/Mk/bsd.port.mk	Fri Jun  8 14:01:01 2012	(r237309)
+++ soc2012/scher/par_ports/head/Mk/bsd.port.mk	Fri Jun  8 14:43:46 2012	(r237310)
@@ -5118,11 +5118,38 @@
 	done; \
 	echo "debugging_out_here: --- LEAVE _PROCESS_ACTIVE_BUILDS SECTION " > ${PORTSDIR}/tmp/log
 
+_TERMINATE_PROCESS_TREE= \
+	${_dparv_START_OUTPUT}; \
+	${ECHO_CMD} Terminating process tree strating from ${.MAKE.PID}; \
+	pids_to_kill=${.MAKE.PID}; \
+	/bin/kill -STOP ${.MAKE.PID} 2> /dev/null || ${DO_NADA}; \
+	ppids=$$( ps -xao pid,ppid | awk "{ if (\$$2==${.MAKE.PID}) {print \$$1} }" ); \
+	pids_to_kill="$${pids_to_kill} $${ppids}"; \
+	/bin/kill -STOP "$${ppids%%$$$$*} $${ppids\#\#*$$$$}" 2> /dev/null || ${DO_NADA}; \
+	while true; do \
+		tmp_ppids=$$(${ECHO_CMD} $${ppids}); \
+		ppids=""; \
+		for ppid in $${tmp_ppids}; do \
+			children=$$( ps -xao pid,ppid | awk "{ if (\$$2==$${ppid}) {print \$$1} }" ); \
+			if [ $${\#children} -eq 0 ]; then continue; fi; \
+			pids_to_kill="$${pids_to_kill} $${children}"; \
+			ppids="$${ppids} $${children}"; \
+			/bin/kill -STOP $${children} 2> /dev/null || ${DO_NADA}; \
+		done; \
+		if [ $${\#ppids} -eq 0 ]; then break; fi; \
+	done; \
+	${ECHO_CMD} PIDs to kill: $${pids_to_kill}; \
+	${_dparv_START_OUTPUT}; \
+	/bin/kill -KILL $${pids_to_kill} 2> /dev/null || ${DO_NADA}
+
 .for deptype in PKG EXTRACT PATCH FETCH BUILD RUN
 ${deptype:L}-depends:
 .if defined(${deptype}_DEPENDS)
 .if !defined(NO_DEPENDS)
-	@depends=`${ECHO_CMD} "${${deptype}_DEPENDS}"`; \
+	@if [ ! ${INSTALLS_DEPENDS} ]; then \
+		trap '${_TERMINATE_PROCESS_TREE}' INT TERM; \
+	fi; \
+	depends=`${ECHO_CMD} "${${deptype}_DEPENDS}"`; \
 	depends=$$( echo "$${depends}" | sed 's/^[[:space:]]*//' | sed 's/[[:space:]]*$$//' ); \
 	active_builds=""; \
 	echo "debugging_out_here: ------------------------- " > ${PORTSDIR}/tmp/log; \
@@ -5265,7 +5292,11 @@
 
 lib-depends:
 .if defined(LIB_DEPENDS) && !defined(NO_DEPENDS)
-	@depends=`${ECHO_CMD} "${LIB_DEPENDS}"`; \
+	@if [ ! ${INSTALLS_DEPENDS} ]; then \
+		trap '${_TERMINATE_PROCESS_TREE}' INT TERM; \
+	fi; \
+	depends=`${ECHO_CMD} "${LIB_DEPENDS}"`; \
+	depends=$$( echo "$${depends}" | sed 's/^[[:space:]]*//' | sed 's/[[:space:]]*$$//' ); \
 	active_builds=""; \
 	echo "debugging_out_here: ------------------------- " > ${PORTSDIR}/tmp/log; \
 	echo "debugging_out_here: ALL DEPS - $${depends}" > ${PORTSDIR}/tmp/log; \



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120608144347.79970106564A>