12

I have an automated deployment workflow that pushes code out to my production servers and triggers database migrations, static file updates, etc. Problem is, gunicorn doesn't automatically reload code changes without the development option --reload, which they recommend not using in production. Instead the instruction is to send an HUP signal to the masterpid. Problem is, I don't know how to retrieve the masterpid in an automated script, though it is easy enough to do manually.

How can I retrieve the materpid value for the gunicorn systemd process in a bash script?

Adam
  • 223
  • 2
  • 7

3 Answers3

10

Add the following to the systemd service file for gunicorn, or add it as an override:

ExecReload=/bin/kill -HUP $MAINPID

You can then reload with systemctl reload gunicorn.

jordanm
  • 869
  • 5
  • 9
3

More detailed explanation for editing your gunicorn service file (based on the answer of @jordanm):

Edit your service file /etc/systemd/system/my_task.service or a similar path

[Unit]
Description=My task running runicorn
After=network.target

[Service]
User=my_user
# [...]
ExecStart=/home/my_user/my_task/.venv/bin/gunicorn --workers 3 --bind unix:my_task.sock -m 007 wsgi:app
ExecReload=/bin/kill -HUP $MAINPID # <------ add this line

[Install]
WantedBy=multi-user.target

Save it, then run the following to reload the config

sudo systemctl enable my_task

Then you can run the following to gracefully restart your gunicorn service (this should be run in your deploy script)

sudo systemctl reload my_task gunicorn restart

If you don't run the systemctl enable my_task command, you might get the following error:

Failed to reload my_task.service: Job type reload is not applicable for unit my_task.service. See system logs and 'systemctl status my_task.service' for details.

0

I have created an answer for similar question here. It could be an easier solution compared to the accepted answer, specially in cases gunicorn is not installed system-wide.

in case link did not work

the one liner below, gets the job perfectly done:

kill -HUP `ps -C gunicorn fch -o pid | head -n 1`

Explanation

pc -C gunicorn only lists the processes with gunicorn command, i.e., workers and master process. Workers are children of master as can be seen using ps -C gunicorn fc -o ppid,pid,cmd. We only need the pid of the master, therefore h flag is used to remove the first line which is PID text. Note that, f flag assures that master is printed above workers.

The correct procedure is to send HUP signal only to the master. In this way gunicorn is gracefully restarted, only the workers, not master, are recreated.

rowman
  • 109
  • 2
  • While this link may answer the question, it is better to include the essential parts of the answer here and provide the link for reference. Link-only answers can become invalid if the linked page changes. - [From Review](/review/low-quality-posts/441173) – Dave M Mar 25 '20 at 12:01
  • @DaveM updated answer – rowman Mar 26 '20 at 07:34