[PATCH v1] strace -D is killed by process group kill.
Fanda Uchytil
strace.t8xuewpmde at h4x.cz
Fri Oct 4 09:29:07 UTC 2019
Hi,
I stumble upon unexpected behavior: if strace is used with option '-D'
(tracer as a detached grandchild) and process (leader) kills whole
process group, it will kill strace too.
It can be easily reproduced by `timeout` from "coreutils":
# timeout -s KILL 2 strace -D -o ./strace-inside.log /bin/sleep 10 &
Here we can see, that `strace` didn't finished its output (because it
was killed):
# tail -n 1 ./strace-inside.log
nanosleep({tv_sec=10, tv_nsec=0},
If `timeout` is not run in '--foreground' mode, it changes process group
and after "timeout" it sends two kills:
setpgid(0, 0) = 0
kill(37337, SIGKILL) = 0
kill(0, SIGKILL) = ?
The first kill is for the `sleep` and the second one is for the process
group (which is `strace` part of). PIDs and their relations are:
timeout pid=30595 [ppid=476 bash ] pgrp=30595
sleep pid=37337 [ppid=30595 timeout] pgrp=30595
strace pid=30603 [ppid=1 systemd] pgrp=30595
Here is "strace log" of `strace` inside `timeout`:
strace: Process 30603 attached
wait4(-1, <unfinished ...>) = ?
+++ killed by SIGKILL +++
I think that detached `strace` should not be killed like that -- it
should not be part of former grandparents' "job pipeline".
Solution for that could be creating a new process group for strace
(= his own pgid). I attached proof-of-concept patch, but please look at
it (I didn't see any side effects, but that doesn't mean there are
none).
--
Fanda Uchytil
---
strace.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/strace.c b/strace.c
index b52a3db3..aeb23351 100644
--- a/strace.c
+++ b/strace.c
@@ -1131,6 +1131,8 @@ startup_attach(void)
_exit(0); /* paranoia */
}
/* grandchild */
+ /* Create new process group, so we'll not be killed by kill(0, ...) */
+ setpgid(0, 0);
/* We will be the tracer process. Remember our new pid: */
strace_tracer_pid = getpid();
}
--
2.20.1
More information about the Strace-devel
mailing list