Retain argv + fds on re-exec, fix USR2 under systemd by notifying new PID #3285
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR stops mangling sys.argv and socket fd numbers on re-exec, thus permitting much improved integration with systemd.
-m
switch is the recommended procedure, so that should workNew feature: send timestamp to properly synchronize reload cycles using
Type=notify-reload
(systemd>= v253
)Fixes: module invocation breaks USR2 upgrading, as modified argv results in modified path #3281
Fixes: more status to systemd #1948
Fixes: Bind to unix socket *and* IP: gunicorn only binds to socket. #2104
Fixes: Compatibility of systemd with zero downtime reloads with SIGUSR2 #2856
systemctl -s USR2 gunicorn.service
now automatically issues graceful quitsystemctl reload gunicorn.service
andsystemctl restart gunicorn.service
unchanged in .service exampleImproves systemd-specific case of: Error instead of warning in logs when sending SIGTERM since v21 #3050
Improves sock fd leak pointed out in: fd leak in thread worker causing periodic outages #3339
Follow-Up plans not included here:
systemd[1]: gunicorn.service: Supervising process 1337 which is not our child. We'll most likely not notice when it exits.
warning, at all< 3.10
and Python>= 3.10
BARRIER=1
so reloading/re-execing in quick success is reliable as wellEXTEND_TIMEOUT_USEC=
so automatic timeouts are reliable as well