Bug#761596: autopkgtest: overrides default SIGINT handler
Martin Pitt
mpitt at debian.org
Mon Sep 15 15:16:26 UTC 2014
Martin Pitt [2014-09-15 16:57 +0200]:
> No, it's not intentional. adt-run installs a few signal handlers to
> ensure proper testbed cleanup after cancelling a test, but that's not
> the case for SIGINT. I've already spent two hours trying to debug
> this, but I'll keep digging. I put your perl script into the test
> suite and confirm the problem.
Ah, like always admitting that you don't have a clue always helps. So
it's bash which is the problem here. Adding
print "SIGINT: ", $SIG{INT}, "\n";
to the test script shows that bash appears to set SIGINT to SIG_IGN
for backgrounded jobs. It appears that this is even described in the
manpage.
Foreground subprocesses work as expected:
| $ bash -c './sigint.pl'
| Use of uninitialized value in print at ./sigint.pl line 3.
| SIGINT:
|
| P: killing
| P: waiting
| P: done
But backgrounded ones don't:
| $ bash -c './sigint.pl & wait'
| SIGINT: IGNORE
|
| P: killing
| P: waiting
| [hangs]
adt-run calls the test script in a rather complicated manner so that
it can slide in a cleanup handler:
script += 'touch %(o)s %(e)s; ' \
'%(t)s 2> >(tee -a %(e)s >&2) > >(tee -a %(o)s) & TPID=$!; ' \
'trap "kill $TPID || true; rm -rf $ADTTMP" TERM; ' \
'wait $TPID;' \
Without this, SIGTERMing adt-run will cause eternal hangs as the child
process of adt-run (i. e. the auxverb running the actual test) won't
be killed.
I'll see to rewiring this to support SIGTERM cleanup while keeping
default signal handlers.
Martin
--
Martin Pitt | http://www.piware.de
Ubuntu Developer (www.ubuntu.com) | Debian Developer (www.debian.org)
More information about the autopkgtest-devel
mailing list