Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Custom systemd service to run Gunicorn not working

I am trying to deploy my Django website to a Ubuntu server. I am following this tutorial: linuxhint.com/create_django_app_ubuntu/. However, the Gunicorn service doesn't work.

I have my site at /home/django/blog.

My Python 3.6 virtualenv is activated at /home/django/.venv/bin/activate (-rwxr-xr-x 1 django root 2207 Sep 21 14:07 activate).

The script for starting the server is at /home/django/bin/start-server.sh (-rwxr-xr-x 1 django root 69 Sep 21 15:50 start-server.sh), with the following content:

cd /home/django
source .venv/bin/activate
cd blog
gunicorn blog.wsgi

Running this script manually works just fine.

The Gunicorn service is at /etc/systemd/system/gunicorn.service, with this content:

[Unit]
Description=Gunicorn
After=network.target

[Service]
Type=simple
User=django
ExecStart=/home/django/bin/start-server.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target

Running systemctl status gunicorn.service gives this:

● gunicorn.service - Gunicorn
   Loaded: loaded (/etc/systemd/system/gunicorn.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Mon 2020-09-21 16:15:17 UTC; 6s ago
  Process: 1114 ExecStart=/home/django/bin/start-server.sh (code=exited, status=203/EXEC)
 Main PID: 1114 (code=exited, status=203/EXEC)

Sep 21 16:15:17 example.com systemd[1]: gunicorn.service: Failed with result 'exit-code'.
Sep 21 16:15:17 example.com systemd[1]: gunicorn.service: Service hold-off time over, scheduling restart.
Sep 21 16:15:17 example.com systemd[1]: gunicorn.service: Scheduled restart job, restart counter is at 5.
Sep 21 16:15:17 example.com systemd[1]: Stopped Gunicorn.
Sep 21 16:15:17 example.com systemd[1]: gunicorn.service: Start request repeated too quickly.
Sep 21 16:15:17 example.com systemd[1]: gunicorn.service: Failed with result 'exit-code'.
Sep 21 16:15:17 example.com systemd[1]: Failed to start Gunicorn.
Sep 21 16:15:18 example.com systemd[1]: gunicorn.service: Start request repeated too quickly.
Sep 21 16:15:18 example.com systemd[1]: gunicorn.service: Failed with result 'exit-code'.
Sep 21 16:15:18 example.com systemd[1]: Failed to start Gunicorn.
Sep 21 14:22:36 example.com systemd[7906]: gunicorn.service: Failed to execute command: Permission denied
Sep 21 14:22:36 example.com systemd[7906]: gunicorn.service: Failed at step EXEC spawning /home/django/bin/start-server.sh: Permission denied
Sep 21 14:23:40 example.com systemd[7940]: gunicorn.service: Failed to execute command: Permission denied
Sep 21 14:23:40 example.com systemd[7940]: gunicorn.service: Failed at step EXEC spawning /home/django/bin/start-server.sh: Permission denied
Sep 21 14:24:47 example.com systemd[7958]: gunicorn.service: Failed to execute command: Permission denied
Sep 21 14:24:47 example.com systemd[7958]: gunicorn.service: Failed at step EXEC spawning /home/django/bin/start-server.sh: Permission denied
Permission denied
.
.
.

I ran chown -R django:django /home/django. Now, the output of ls -lah /home/django is:

total 32K
drwxr-xr-x 5 django django 4.0K Sep 21 14:19 .
drwxr-xr-x 3 root   root   4.0K Sep 21 14:04 ..
-rw-r--r-- 1 django django  220 Apr  4  2018 .bash_logout
-rw-r--r-- 1 django django 3.7K Apr  4  2018 .bashrc
-rw-r--r-- 1 django django  807 Apr  4  2018 .profile
drwxr-xr-x 4 django django 4.0K Sep 21 14:07 .venv
drwxr-xr-x 2 django django 4.0K Sep 21 15:58 bin
drwxr-xr-x 3 django django 4.0K Sep 21 14:08 blog

Solution

Thanks to Dmitry Belaventsev, the solution to this is to change

ExecStart=/home/django/bin/start-server.sh

to

ExecStart=/bin/bash /home/django/bin/start-server.sh

In the file /etc/systemd/system/gunicorn.service.

like image 761
xedc Avatar asked Oct 19 '25 08:10

xedc


1 Answers

Your systemd service is setup to execute the script from behalf of django user. In the meantime:

ls -lah /home/django

total 32K
drwxr-xr-x 5 django django 4.0K Sep 21 14:19 .
drwxr-xr-x 3 root   root   4.0K Sep 21 14:04 ..
-rw-r--r-- 1 django django  220 Apr  4  2018 .bash_logout
-rw-r--r-- 1 django django 3.7K Apr  4  2018 .bashrc
-rw-r--r-- 1 django django  807 Apr  4  2018 .profile
drwxr-xr-x 4 django root   4.0K Sep 21 14:07 .venv
drwxr-xr-x 2 root   root   4.0K Sep 21 15:58 bin
drwxr-xr-x 3 root   root   4.0K Sep 21 14:08 blog

As you can see:

drwxr-xr-x 3 root   root   4.0K Sep 21 14:04 ..

and

drwxr-xr-x 2 root   root   4.0K Sep 21 15:58 bin

which means:

  1. /home directory belongs to root:root
  2. /home/django/bin belongs to root:root

To let systemd execute a bash script from behalf of django user:

  1. That script should be executable
  2. All parent directories should have execution rights
  3. All those directories and the script should be available for django user

The quickest solution:

chown -R /home/django django:django

Also you could play with group and group rights as well.

like image 164
Dmitry Belaventsev Avatar answered Oct 22 '25 03:10

Dmitry Belaventsev



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!