Skip to content

Commit a892a2d

Browse files
peffjrn
authored andcommitted
tests: kill backgrounded processes more robustly
t0081 creates several background processes that write to a fifo and then go to sleep for a while (so the reader of the fifo does not see EOF). Each background process is made in a curly-braced block in the shell, and after we are done reading from the fifo, we use "kill $!" to kill it off. For a simple, single-command process, this works reliably and kills the child sleep process. But for more complex commands like "make_some_output && sleep", the results are less predictable. When executing under bash, we end up with a subshell that gets killed by the $! but leaves the sleep process still alive. This is bad not only for process hygeine (we are leaving random sleep processes to expire after a while), but also interacts badly with the "prove" command. When prove executes a test, it does not realize the test is done when it sees SIGCHLD, but rather waits until the test's stdout pipe is closed. The orphaned sleep process may keep that pipe open via test-lib's file descriptor 5, causing prove to hang for 100 seconds. The solution is to explicitly use a subshell and to exec the final sleep process, so that when we "kill $!" we get the process id of the sleep process. [jn: original patch by Jeff had some additional bits: 1. Wrap the "kill" in a test_when_finished, since we want to clean up the process whether the test succeeds or not. 2. The "kill" is part of our && chain for test success. It probably won't fail, but it can if the process has expired before we manage to kill it. So let's mark it as OK to fail. I'm postponing that for now.] Reported-by: Junio C Hamano <[email protected]> Signed-off-by: Jeff King <[email protected]> Signed-off-by: Jonathan Nieder <[email protected]>
1 parent 9e11398 commit a892a2d

File tree

1 file changed

+6
-6
lines changed

1 file changed

+6
-6
lines changed

t/t0081-line-buffer.sh

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,10 @@ long_read_test () {
4747
rm -f input &&
4848
mkfifo input &&
4949
{
50-
{
50+
(
5151
generate_tens_of_lines $tens_of_lines "$line" &&
52-
sleep 100
53-
} >input &
52+
exec sleep 100
53+
) >input &
5454
} &&
5555
test-line-buffer input <<-EOF >output &&
5656
binary $readsize
@@ -109,11 +109,11 @@ test_expect_success PIPE '1-byte read, no input available' '
109109
rm -f input &&
110110
mkfifo input &&
111111
{
112-
{
112+
(
113113
printf "%s" a &&
114114
printf "%s" b &&
115-
sleep 100
116-
} >input &
115+
exec sleep 100
116+
) >input &
117117
} &&
118118
test-line-buffer input <<-\EOF >actual &&
119119
binary 1

0 commit comments

Comments
 (0)