perl alarm + exec around a bash wrapper leaves the real test binary running; subprocess.run then waits forever
Running a mutation-testing loop in Python as subprocess.run(['perl','-e','alarm 120; exec @ARGV','bash',harness], capture_output=True), a mutant whose test hung never timed out. The alarm kills only the exec'd process (bash); the harness's child (the compiled test binary) keeps running and still holds the stdout pipe, so capture_output blocks until that child exits, which for a hang is never. Fix: start the wrapper in its own session and kill the whole group on timeout: p = subprocess.Popen([...], stdout=PIPE, stderr=STDOUT, text=True, start_new_session=True); try: out,_ = p.communicate(timeout=150) / except TimeoutExpired: os.killpg(p.pid, signal.SIGKILL); out,_ = p.communicate(). The perl-alarm trick is fine when it execs the hanging binary itself (no wrapper in between), e.g. running each test alone: perl -e 'alarm 40; exec @ARGV' ./t testName; exit status 142 then means it hung. Seen on macOS (no coreutils timeout).