Skip to content

Commit

Permalink
feat: resend SIGTERM to reloader child
Browse files Browse the repository at this point in the history
Signed-off-by: Simó Albert i Beltran <sim6@bona.gent>
  • Loading branch information
sim6 committed Apr 1, 2023
1 parent 92c6380 commit 20e079f
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 3 deletions.
1 change: 1 addition & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ Unreleased
- The development server discards header keys that contain underscores ``_``, as they
are ambiguous with dashes ``-`` in WSGI. :pr:`2621`
- ``secure_filename`` looks for more Windows reserved file names. :pr:`2622`
- Resend `SIGTERM` to reloader child. :pr:`2633`


Version 2.2.3
Expand Down
21 changes: 18 additions & 3 deletions src/werkzeug/_reloader.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import builtins
import fnmatch
import os
import signal
import subprocess
import sys
import threading
import time
import types
import typing as t
from itertools import chain
from pathlib import PurePath
Expand Down Expand Up @@ -263,12 +266,26 @@ def restart_with_reloader(self) -> int:
"""Spawn a new Python interpreter with the same arguments as the
current one, but running the reloader thread.
"""
old_sigterm_handler = signal.getsignal(signal.SIGTERM)
while True:
_log("info", f" * Restarting with {self.name}")
args = _get_args_for_reloading()
new_environ = os.environ.copy()
new_environ["WERKZEUG_RUN_MAIN"] = "true"
exit_code = subprocess.call(args, env=new_environ, close_fds=False)
process = subprocess.Popen(args, env=new_environ, close_fds=False)

def new_sigterm_handler(
signal_number: int,
frame: t.Optional[types.FrameType],
process: subprocess.Popen[builtins.bytes] = process,
) -> None:
process.send_signal(signal.SIGTERM)
if callable(old_sigterm_handler):
old_sigterm_handler(signal_number, frame)

signal.signal(signal.SIGTERM, new_sigterm_handler)
exit_code = process.wait()
signal.signal(signal.SIGTERM, old_sigterm_handler)

if exit_code != 3:
return exit_code
Expand Down Expand Up @@ -432,8 +449,6 @@ def run_with_reloader(
reloader_type: str = "auto",
) -> None:
"""Run the given function in an independent Python interpreter."""
import signal

signal.signal(signal.SIGTERM, lambda *args: sys.exit(0))
reloader = reloader_loops[reloader_type](
extra_files=extra_files, exclude_patterns=exclude_patterns, interval=interval
Expand Down

0 comments on commit 20e079f

Please sign in to comment.