From: Thomas De Schampheleire <patrickdepinguin@gmail.com>
To: buildroot@busybox.net
Subject: [Buildroot] [PATCH v5 10/11] autobuild-run: kill all children on SIGTERM
Date: Fri, 12 Dec 2014 21:04:55 +0100 [thread overview]
Message-ID: <1418414696-32584-11-git-send-email-patrickdepinguin@gmail.com> (raw)
In-Reply-To: <1418414696-32584-1-git-send-email-patrickdepinguin@gmail.com>
From: Thomas De Schampheleire <thomas.de.schampheleire@gmail.com>
The autobuild-run spawns the main build process through the timeout
command. To handle its job correctly, this command creates all children
in its own process group, different from the process group of
autobuild-run itself.
Thus, when autobuild-run is killed and the signal handler kills the
entire process group, the build processes run through timeout remain
alive.
To handle this, record the PIDs of the timeout processes in an array
shared between the main autobuild-run process and its instances. The
signal handler will iterate over all active processes in this array, and
kill them explicitly.
If a new timeout process would be started after the signal handler was
invoked but before the entire process tree is killed, this process could
remain alive too. To prevent this from occurring, the signal handler now
starts with terminating all instances.
Lastly, the signal handler would be called for all instances, which is
not intended, so prevent that by uninstalling the signal handler as a
first step of the handler itself.
Signed-off-by: Thomas De Schampheleire <thomas.de.schampheleire@gmail.com>
---
scripts/autobuild-run | 39 ++++++++++++++++++++++++++++++++++++---
1 file changed, 36 insertions(+), 3 deletions(-)
diff --git a/scripts/autobuild-run b/scripts/autobuild-run
index 237d443..3c448bd 100755
--- a/scripts/autobuild-run
+++ b/scripts/autobuild-run
@@ -97,9 +97,10 @@ import urllib2
import csv
from random import randint
import subprocess
-from multiprocessing import Process
+import multiprocessing
import signal
import os
+import errno
import shutil
from time import localtime, strftime
import sys
@@ -444,11 +445,16 @@ def do_build(**kwargs):
srcdir = os.path.join(idir, "buildroot")
f = open(os.path.join(outputdir, "logfile"), "w+")
log_write(log, "INFO: build started")
+
cmd = ["timeout", str(MAX_DURATION), "make", "O=%s" % outputdir,
"-C", srcdir, "BR2_DL_DIR=%s" % dldir,
"BR2_JLEVEL=%s" % kwargs['njobs']] \
+ kwargs['make_opts'].split()
- ret = subprocess.call(cmd, stdout=f, stderr=f)
+ sub = subprocess.Popen(cmd, stdout=f, stderr=f)
+ kwargs['buildpid'][kwargs['instance']] = sub.pid
+ ret = sub.wait()
+ kwargs['buildpid'][kwargs['instance']] = 0
+
# 124 is a special error code that indicates we have reached the
# timeout
if ret == 124:
@@ -692,8 +698,32 @@ def main():
print "WARN: tarballs of results will be kept locally only"
def sigterm_handler(signum, frame):
+ """Kill all children"""
+
+ # uninstall signal handler to prevent being called for all subprocesses
+ signal.signal(signal.SIGTERM, signal.SIG_DFL)
+
+ # stop all instances to prevent new children to be spawned
+ for p in processes:
+ p.terminate()
+
+ # kill build processes started with timeout (that puts its children
+ # explicitly in a separate process group)
+ for pid in buildpid:
+ if pid == 0:
+ continue
+ try:
+ os.kill(pid, signal.SIGTERM)
+ except OSError as e:
+ if e.errno != errno.ESRCH: # No such process, ignore
+ raise
+
+ # kill any remaining children in our process group
os.killpg(os.getpgid(os.getpid()), signal.SIGTERM)
+
sys.exit(1)
+
+ buildpid = multiprocessing.Array('i', int(args['--ninstances']))
processes = []
for i in range(0, int(args['--ninstances'])):
p = Process(target=run_instance, kwargs=dict(
@@ -704,11 +734,14 @@ def main():
http_password = args['--http-password'],
submitter = args['--submitter'],
make_opts = args['--make-opts'],
- upload = upload
+ upload = upload,
+ buildpid = buildpid
))
p.start()
processes.append(p)
+
signal.signal(signal.SIGTERM, sigterm_handler)
+
for p in processes:
p.join()
--
1.8.5.1
next prev parent reply other threads:[~2014-12-12 20:04 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-12 20:04 [Buildroot] [PATCH v5 00/11] autobuild-run improvements Thomas De Schampheleire
2014-12-12 20:04 ` [Buildroot] [PATCH v5 01/11] scripts: add python module docopt Thomas De Schampheleire
2014-12-12 20:04 ` [Buildroot] [PATCH v5 02/11] autobuild-run: use docopt for argument parsing Thomas De Schampheleire
2015-02-05 22:52 ` Thomas Petazzoni
2015-02-06 11:13 ` Thomas De Schampheleire
2015-02-28 19:31 ` Thomas Petazzoni
2014-12-12 20:04 ` [Buildroot] [PATCH v5 03/11] autobuild-run: add option --make-opts for custom Buildroot options Thomas De Schampheleire
2015-02-28 19:29 ` Thomas Petazzoni
2015-03-01 20:42 ` Thomas De Schampheleire
2015-03-02 8:33 ` Thomas Petazzoni
2014-12-12 20:04 ` [Buildroot] [PATCH v5 04/11] autobuild-run: use **kwargs to avoid explicit parameter passthroughs Thomas De Schampheleire
2015-02-06 7:58 ` Thomas Petazzoni
2015-02-06 11:15 ` Thomas De Schampheleire
2014-12-12 20:04 ` [Buildroot] [PATCH v5 05/11] autobuild-run: check-requirements does not need to know the login details Thomas De Schampheleire
2014-12-12 20:04 ` [Buildroot] [PATCH v5 06/11] autobuild-run: set LC_ALL=C to not use locale settings of host machine Thomas De Schampheleire
2014-12-12 20:04 ` [Buildroot] [PATCH v5 07/11] autobuild-run: improve the logic to generate build-end.log Thomas De Schampheleire
2014-12-12 20:04 ` [Buildroot] [PATCH v5 08/11] autobuild-run: save config.log files for failed package Thomas De Schampheleire
2014-12-12 20:04 ` [Buildroot] [PATCH v5 09/11] autobuild-run: extend TODO list Thomas De Schampheleire
2014-12-12 20:04 ` Thomas De Schampheleire [this message]
2014-12-12 20:16 ` [Buildroot] [PATCH v5 10/11] autobuild-run: kill all children on SIGTERM Thomas De Schampheleire
2014-12-12 20:18 ` Thomas De Schampheleire
2015-02-28 19:28 ` Thomas Petazzoni
2015-03-01 20:02 ` Thomas De Schampheleire
2014-12-12 20:04 ` [Buildroot] [PATCH v5 11/11] autobuild-run: catch KeyboardInterrupt in the same way as SIGTERM Thomas De Schampheleire
2014-12-22 12:45 ` [Buildroot] [PATCH v5 00/11] autobuild-run improvements Thomas De Schampheleire
2015-02-28 19:34 ` Thomas Petazzoni
2015-03-01 21:13 ` Thomas De Schampheleire
2015-03-15 13:34 ` Thomas Petazzoni
2015-03-15 13:51 ` Thomas De Schampheleire
2015-03-15 14:10 ` Thomas Petazzoni
2015-03-18 16:03 ` André Erdmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1418414696-32584-11-git-send-email-patrickdepinguin@gmail.com \
--to=patrickdepinguin@gmail.com \
--cc=buildroot@busybox.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox