#19137: runserver child started via autoreload won't always exit cleanly
--------------------------------------------+--------------------
     Reporter:  santtu                      |      Owner:  nobody
         Type:  Uncategorized               |     Status:  new
    Component:  Core (Management commands)  |    Version:  1.4
     Severity:  Normal                      |   Keywords:
 Triage Stage:  Unreviewed                  |  Has patch:  0
Easy pickings:  0                           |      UI/UX:  0
--------------------------------------------+--------------------
 When using django.utils.autoreload (for example, runserver with
 use_reloader option enabled) it is possible to get into a situation where
 you might think the server has been killed, but actually is not and is
 listening to the port.

 Steps to reproduce:

 1. Start application, when use_reloader is enabled (manage.py runserver)
 2. Search for a pair of the manage.py processes (ps -aef --forest | grep
 runserver etc.), make a note of which is the parent and which is the child
 3. Kill the parent using command-line kill "kill -INT <parent pid>"
 4. Look at ps output, and you'll find the child still alive, and via lsof
 -i | grep LISTEN you can see it is still listening on the server port.

 Normally if you use runserver from a terminal, pressing control-C will
 send SIGINT to the whole foreground process group. Both the parent and
 child will thus receive SIGINT and will exit cleanly.

 If you however kill the *parent* only, the child will not receive any
 signal, and thus will happily keep running.

 This is a bit of a bummer when doing test automation, which tries to clean
 up the test environment by killing the parent -- but the child won't go
 away, and keeping server port reserved.

 It is possible to do a semi-work-around by spawning runserver in its own
 process group, but it requires some careful environment crafting (and I
 haven't been able to get it reliably working on macos -- there are
 apparently some semantic differences in setpgrp wrt/ linux and macos). And
 of course is hardly obvious for anyone encountering this problem for the
 first time.

 I have a patch for this and I'll make a pull request and link to that when
 I have a ticket id..

-- 
Ticket URL: <https://code.djangoproject.com/ticket/19137>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to