<div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-size:small"><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Feb 11, 2022 at 3:03 PM Jan Stancek <<a href="mailto:jstancek@redhat.com">jstancek@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Fri, Feb 11, 2022 at 7:48 AM Li Wang <<a href="mailto:liwang@redhat.com" target="_blank">liwang@redhat.com</a>> wrote:<br>
><br>
><br>
><br>
> On Fri, Feb 11, 2022 at 12:18 AM Martin Doucha <<a href="mailto:mdoucha@suse.cz" target="_blank">mdoucha@suse.cz</a>> wrote:<br>
>><br>
>> When the main test process crashes or gets killed e.g. by OOM killer,<br>
>> the watchdog process currently does not clean up any remaining child<br>
>> processes. Fix this by sending SIGKILL to the test process group when<br>
>> the watchdog process gets notified that the main test process has exited<br>
>> for any reason.<br>
><br>
><br>
>><br>
>> --- a/lib/tst_test.c<br>
>> +++ b/lib/tst_test.c<br>
>> @@ -1399,6 +1399,13 @@ static void sigint_handler(int sig LTP_ATTRIBUTE_UNUSED)<br>
>>         }<br>
>>  }<br>
>><br>
>> +static void sigchild_handler(int sig LTP_ATTRIBUTE_UNUSED)<br>
>> +{<br>
>> +       /* If the test process is dead, send SIGKILL to its children */<br>
>> +       if (kill(test_pid, 0))<br>
>> +               kill(-test_pid, SIGKILL);<br>
>> +}<br>
>> +<br>
>>  unsigned int tst_timeout_remaining(void)<br>
>>  {<br>
>>         static struct timespec now;<br>
>> @@ -1481,6 +1488,7 @@ static int fork_testrun(void)<br>
>>                 tst_disable_oom_protection(0);<br>
>>                 SAFE_SIGNAL(SIGALRM, SIG_DFL);<br>
>>                 SAFE_SIGNAL(SIGUSR1, SIG_DFL);<br>
>> +               SAFE_SIGNAL(SIGCHLD, SIG_DFL);<br>
>>                 SAFE_SIGNAL(SIGINT, SIG_DFL);<br>
>>                 SAFE_SETPGID(0, 0);<br>
>>                 testrun();<br>
>> @@ -1560,6 +1568,7 @@ void tst_run_tcases(int argc, char *argv[], struct tst_test *self)<br>
>><br>
>>         SAFE_SIGNAL(SIGALRM, alarm_handler);<br>
>>         SAFE_SIGNAL(SIGUSR1, heartbeat_handler);<br>
>> +       SAFE_SIGNAL(SIGCHLD, sigchild_handler);<br>
><br>
><br>
> Do we really need setup this signal handler for SIGCHILD?<br>
<br>
 I had same question.<br>
<br>
><br>
> Since we have already called 'SAFE_WAITPID(test_pid, &status, 0)'<br>
> in the library process (lib_pid) which rely on SIGCHILD as well.<br>
> And even this handler will be called everytime when test exit normally.<br>
><br>
> Maybe better just add a kill function to cleanup the remain<br>
> descendants if main test process exit with abonormal status.<br>
><br>
> e.g.<br>
><br>
> --- a/lib/tst_test.c<br>
> +++ b/lib/tst_test.c<br>
> @@ -1503,6 +1503,8 @@ static int fork_testrun(void)<br>
>         if (WIFEXITED(status) && WEXITSTATUS(status))<br>
>                 return WEXITSTATUS(status);<br>
><br>
> +       kill(-test_pid, SIGKILL);<br>
<br>
Could we skip the call if forks_child == 0 ?<br></blockquote><div><br></div><div><div class="gmail_default" style="font-size:small">+1 Obviously yes!</div></div><div><br></div></div><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div>Regards,<br></div><div>Li Wang<br></div></div></div></div>