рдЬрдм рдкреНрд░рдХреНрд░рд┐рдпрд╛ SIGTERM
, рддреЛ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХреБрдЫ рд╕рдВрдЪрд╛рд▓рди рдФрд░ рдХреБрдЫ рднреА рдЫрдкрд╛рдИ рдХреЗ рдмрд┐рдирд╛ред
werkzeug.serving.run_simple
рдкреНрд░рдХреНрд░рд┐рдпрд╛ SIGTERM
рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЖрдорддреМрд░ рдкрд░ 141 рдХреЗ рд░рд┐рдЯрд░реНрди рдХреЛрдб рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ (рдПрдХ рд╕рдВрдпреБрдХреНрдд рд░рд╛рд╖реНрдЯреНрд░ / рдЕрдирд░реНрдерд┐рдд SIGPIPE
рдХрд╛ рд▓рдХреНрд╖рдг), рдФрд░ рдкреБрдирдГ рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрд╝реЛрдВрдмреА рд╣реЛ рдЬрд╛рддреА рд╣реИ (рдпрд╣) рдкреЛрд░реНрдЯ рдХреЛ рдмрдВрдзреЗ рд░рд╣рдиреЗ рдХреЗ рдХрд╛рд░рдг рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдорд╛рд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
SIGTERM
рд▓рд┐рдП рдПрдХ рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рдирд╛ рдЬреЛ рдХреЗрд╡рд▓ sys.exit(0)
рдЪрд╛рд▓рд╛рди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ (рдЗрд╕рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдХреЛрдИ рдФрд░ рдЕрдзрд┐рдХ рджреБрд░реНрд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рд╣реИ), рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╣реА рдлрд┐рдХреНрд╕ рд╣реИред
рдореИрдВ рдЕрдм рдПрдХ рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдмрд╛рдВрдзрддрд╛ рд╣реВрдВ рдЬрдм рдкреБрдирдГ рд▓реЛрдбрд░ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдореНрдореАрдж рд╣реИ рдХреА рд╡реЛ рдорджрдж рдХрд░рджреЗред
рдпрд╣ рдХрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдареАрдХ рд╣реИ? рдпрд╣ рдЕрднреА рднреА рдлреНрд▓рд╛рд╕реНрдХ 0.8 рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред
рдпрд╣ рдЕрднреА рднреА рдПрдХ рдореБрджреНрджрд╛ рд╣реИ, рдЬрдм рдПрдХ рдЖрдИрдбреАрдИ рдХреЗ рд╕рд╛рде рдлреНрд▓рд╛рд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдХреА рдХрд╛рдлреА рдкрд░реЗрд╢рд╛рди рд╣реЛрддреА рд╣реИ - рдЬрдм рднреА рдЖрдк рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВ рддреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдиреА рд░рд╣рддреА рд╣реИ рдФрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред
рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд┐рд░рдВрддрд░ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЖрдЬ рдЖрдИрдЖрд░рд╕реА рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд░реНрдЪрд╛ рджреЗрдЦреЗрдВред
20:20 < mcdonc> can somebody fix flask's reloader so when you send the process a sigint it actually stops the child process
20:20 < untitaker> mcdonc: it seems to work for me
20:21 < untitaker> mcdonc: it used to cause problems but for me it's fixed in latest master
20:21 < mcdonc> ah good. i just got some number of complaints from people who run it under supervisor.
20:22 < untitaker> mcdonc: you are talking about the one from the Py3 port?
20:22 < untitaker> released versions should work properly
20:22 < mcdonc> no.. i am talking about.. well.. yes, i dont actually know what i'm talking about ;-) i dont use it, i just get people telling me they need to send a stop signal to the entire process group instead of to the process to make sure its killed.
20:23 < mcdonc> this is not recent.. for the last year or so
20:23 < mcdonc> why people run the reloader under supervisor (presumably in production) i cannot fathom
20:23 < mcdonc> but they do
20:24 < Alex_Gaynor> mcdonc: I've toyed with using supervisord in dev, FWIW
20:24 < Alex_Gaynor> mcdonc: for cases where you don't just have web proc, you've also got background daemons and such, it could be nice
[...]
20:32 < DasIch> untitaker: the supervisor issue is independent from the threading/thread issue
20:32 < untitaker> DasIch: ah okay
20:32 < untitaker> didn't know that
20:32 < untitaker> DasIch: is the reloader behaving weird in supervisor?
20:33 < DasIch> untitaker: I guess what happens if you run the reloader in supervisor is that supervisor kill the reloading process but that doesn't kill the process started by the reloader
20:34 < untitaker> DasIch: couldn't one write a wrapper shell script that kills both?
20:34 < untitaker> at least for now
20:34 < DasIch> untitaker: I think you shouldn't use the reloader in production
20:35 < untitaker> well yeah
20:35 < asdf`> (supervisord has a 'kill as group' thing)
20:35 < DasIch> right there is that as well
20:35 < asdf`> (it even mentions the werkzeug reloader in the docs paragraph about it!)
20:36 < mcdonc> yes i put it there
20:37 < asdf`> (then you might want to fix it, because AFAIR it actually says 'flask', while the reloader is part of werkzeug. But i admit 'flask' is something more people will know)
20:37 < mcdonc> nobody reads docs anyway ;)
20:38 < DasIch> I just wanted to mention I don't care unless someone creates an issue with a valid use case for that but apparently this seems to be it https://github.com/mitsuhiko/werkzeug/issues/58
20:38 < mcdonc> like alex said, it's not entirely crazy to want to use the reloader under supervisor in dev, esp. if your app is reliant on other processes being started
20:39 < mcdonc> i actually dont run my own apps under supervisor, but that's because i don't use a reloader, i just press ctrl-c.. because i'm a savage
20:40 < DasIch> I do use the reloader but I tend to save so often with bad syntax that I end up restarting manually all the time
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред
os.kill(parent_id, signal.SIGTERM)
рдмрдЪреНрдЪреЛрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдирд╣реАрдВ рдорд╛рд░рддрд╛ рд╣реИред
рдореИрдВрдиреЗ werkzeug.serving
рд▓рд┐рдП testuite рдХреЛ рдкреБрдирдГрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдореВрд╣ рдХреЛ рдорд╛рд░рдХрд░ рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛рдо рдХрд┐рдпрд╛: https://github.com/mitsuhiko/werkzeug/blob/a00377315bbf02ec48fdad22c6bb08433fc1b9c1/tests/conftest.py#L158
рдореИрдВ рдлреНрд▓рд╛рд╕реНрдХ рдореЗрдВ рдбрд┐рдмрдЧ рдореЛрдб (use_debugger = True) рдХреЗ рд╕рд╛рде рдЗрд╕реА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ "рдореВрд▓" рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ 0 рдХрд╛ рд░рд┐рдЯрд░реНрди рдХреЛрдб рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдбрд┐рдмрдЧ рдореЛрдб рд╕рдХреНрд╖рдо рдХрд┐рдП рдмрд┐рдирд╛, SIGTERM рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ 143 рдХреЗ рд╕рд╛рде рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рддреА рд╣реИред рдкрд╛рдпрдерди 2.7.5ред
рдЗрд╕ рдмрдЧ рд╕реЗ рднреА рдорд╛рд░рд╛, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ docker stop
SIGTERM
werkzeug- рд╕рдВрдЪрд╛рд▓рд┐рдд рд╕рд░реНрд╡рд░ (рдореЛрдЯреЛ) рдХреЛ рднреЗрдЬ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд░ рдиреЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдлрд┐рд░ docker рдиреЗ SIGKILL
рд╕рд╛рде рдЗрд╕реЗ рдорд╛рд░ рдбрд╛рд▓рд╛ред рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдирд┐рдХрд╛рд╕ рдХреЛрдб рдореЗрдВред
рдбреЙрдХрдлрд╝рд░рд╛рдЗрд▓ ( STOPSIGNAL SIGINT
) рдореЗрдВ рдкрд╕рдВрджреАрджрд╛ рд╕реНрдЯреЙрдк рд╕рд┐рдЧреНрдирд▓ рдХреЗ рд░реВрдк рдореЗрдВ SIGINT
(Ctrl + C) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдерд╛, рдЗрд╕рдХреЗ рдмрд╛рдж рдХрдВрдЯреЗрдирд░ рд╕рд╛рдл рдмрдВрдж рд╣реЛ рдЧрдПред
рдбреЙрдХрд░ рдХреЗ рдЕрдВрджрд░ рдлреНрд▓рд╛рд╕реНрдХ рдРрдк рдЪрд▓рд╛рддреЗ рд╕рдордп рдореБрдЭреЗ рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ; рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрдВрдЯреЗрдирд░ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП STOPSIGNAL SIGINT
рдЕрднреА рднреА рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ SIGKILL
ред
рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддрд╛ред рдореИрдВрдиреЗ 2.7 рдФрд░ 3.7 рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкрд╛рдпрдерди рдХрдВрдЯреЗрдирд░ рдХреЗ рд╕рд╛рде рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИред рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбреЙрдХрд░реАрдлрд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:
FROM python:2.7
WORKDIR /usr/src/app
RUN pip install click \
werkzeug \
sqlalchemy \
jinja2
COPY . .
RUN python manage-shorty.py initdb
ENTRYPOINT ["python"]
CMD ["manage-shorty.py", "runserver"]
рдФрд░ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде examples
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдбреЙрдХрд░реАрдлрд╛рдЗрд▓ рд╕реЗ рдПрдХ рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛:
docker build -t werkzeug-examples .
рдореИрдВ рддрдм рдЕрдВрддрдГрдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореЛрдб рдореЗрдВ рдХрдВрдЯреЗрдирд░ рдЪрд▓рд╛рдКрдВрдЧрд╛ рдФрд░ рдЙрд╕рдХреЗ рд╕рд╛рде рд░рджреНрдж рдХрд░реВрдВрдЧрд╛:
$ docker run -it --name werkzeug-example werkzeug-examples
* Running on http://localhost:5000/ (Press CTRL+C to quit)
* Restarting with stat
^C
docker ps
рдЪрд▓рдиреЗ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ 0
:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8c708ea4ef77 werkzeug-examples "python manage-shortтАж" About a minute ago Exited (0) 58 seconds ago werkzeug-example
рдХрдВрдЯреЗрдирд░ рдЪрд▓рд╛рдирд╛ рдФрд░ docker stop werkzeug-example
рд╕рд╛рде рд░реБрдХрдирд╛ рднреА 0
рд╕рд╛рде рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдбреЙрдХрд░ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдЗрди рдХрдорд╛рдВрдбреЛрдВ рдХреЛ рдЪрд▓рд╛рдпрд╛:
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:39 2019
OS/Arch: darwin/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.12)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:13:06 2019
OS/Arch: linux/amd64
Experimental: false
рдХреНрдпрд╛ рдЖрдк рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрднрд╡ рдХреА рдЬрд╛ рд░рд╣реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ?
рдЬрдм рддрдХ рд╣рдо рдПрдХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкрд░рд┐рджреГрд╢реНрдп рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рддрдм рддрдХ рдореИрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджреВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдбреЙрдХрд░ рдФрд░ рд╡рд░реНрдХрд░реНрдЬрд╝реБрдЧ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЗрд╕ рдмрдЧ рд╕реЗ рднреА рдорд╛рд░рд╛, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ
docker stop
SIGTERM
werkzeug- рд╕рдВрдЪрд╛рд▓рд┐рдд рд╕рд░реНрд╡рд░ (рдореЛрдЯреЛ) рдХреЛ рднреЗрдЬ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд░ рдиреЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдлрд┐рд░ docker рдиреЗSIGKILL
рд╕рд╛рде рдЗрд╕реЗ рдорд╛рд░ рдбрд╛рд▓рд╛ред рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рдирд┐рдХрд╛рд╕ рдХреЛрдб рдореЗрдВредрдбреЙрдХрдлрд╝рд░рд╛рдЗрд▓ (
STOPSIGNAL SIGINT
) рдореЗрдВ рдкрд╕рдВрджреАрджрд╛ рд╕реНрдЯреЙрдк рд╕рд┐рдЧреНрдирд▓ рдХреЗ рд░реВрдк рдореЗрдВSIGINT
(Ctrl + C) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдерд╛, рдЗрд╕рдХреЗ рдмрд╛рдж рдХрдВрдЯреЗрдирд░ рд╕рд╛рдл рдмрдВрдж рд╣реЛ рдЧрдПред