Skip to content

Instantly share code, notes, and snippets.

@ricferr
Created May 24, 2018 09:13
Show Gist options
  • Star 15 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save ricferr/90583f608f0b0ae9c3cf6833be04ab85 to your computer and use it in GitHub Desktop.
Save ricferr/90583f608f0b0ae9c3cf6833be04ab85 to your computer and use it in GitHub Desktop.
How to create a systemd service for python script with virtualenv
[Unit]
Description=Some description
After=network.target
[Service]
Type=simple
User=user
WorkingDirectory=/home/user/somedir
Environment=PYTHONPATH=/home/user/somedir
ExecStart=/home/user/venv/bin/python script.py
Restart=on-failure
[Install]
WantedBy=multi-user.target
@ricferr
Copy link
Author

ricferr commented Jun 25, 2018

Put these in /etc/systemd/system/

@shoguevara
Copy link

shoguevara commented Oct 11, 2019

This one is tested and works
Start python app from venv with systemd
Example
venv location - /home/path/to/venv

command to start the app:
source /home/path/to/venv/bin/activate
python app.py

systemd service config:
/etc/systemd/system/some.service

[Unit]
Description="Description"

[Service]
User=myUser
Group=myGroup
WorkingDirectory=/home/path/to/
VIRTUAL_ENV=/home/path/to/venv
Environment=PATH=$VIRTUAL_ENV/bin:$PATH
ExecStart=/home/path/to/venv/bin/python app.py
Restart=on-failure

[Install]
WantedBy=multi-user.target

@dwesolowski
Copy link

How do we then deactivate with ExecStop?

@shoguevara
Copy link

How do we then deactivate with ExecStop?

Sorry, needs additional digging - unfortunately I'm not an expert in a field, just achieved this result and shared it here. Moved far away from the issue since then.

@Arregator
Copy link

I found that on the left side of [Service] section you may put only pre-defined in systemd.service(5) man page (type man 5 systemd.service for more details), so I changed a bit you definition to avoid error messages:

[Unit]
Description=HTTP Python server at http://<you_ip_adress>:8000
Documentation=https://docs.python.org/3.7/library/http.server.html
After=network.target

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/usr/local/miniconda3/envs/<vent>/bin
Environment="VIRTUAL_ENV=/usr/local/miniconda3/envs/<vent>"
Environment="PATH=$VIRTUAL_ENV/bin:$PATH"
ExecStartPre=bash /root/.bashrc
ExecStart=/usr/local/miniconda3/envs/<vent>/bin/python -m http.server 8000 --bind <you_ip_adress> --directory /<path>/<to my http root>
Restart=always

[Install]
WantedBy=multi-user.target

I also call my ~/.bashrc where I call conda activate < < vent > >, but that does not seem working well as I see command not found in service status though it does not prevent from service starting.

If you know the way to issue conda activate < < vent > > just before a service startup - please, let me know, I appreciate it.

Thank you.

@ricferr
Copy link
Author

ricferr commented Mar 28, 2020 via email

@dwesolowski
Copy link

dwesolowski commented Mar 28, 2020

I use the below to run a python discord bot script with virtualenv

[Unit]
Description=Embed Bot
After=multi-user.target

[Service]
User=discord
Group=discord
Type=idle
WorkingDirectory=/opt/discord/embeds/
ExecStart=/opt/discord/embeds/bot-env/bin/python3 start.py
Restart=on-failure

[Install]
WantedBy=multi-user.target

start.py is the bot itself.

/opt/discord/embeds - root with the bot script
/opt/discord/embeds/bot-env - virtualenv

@641i130
Copy link

641i130 commented May 21, 2021

Thank you this helped me solve an issue I was having!

@load-net
Copy link

[Unit]
Description="run-script"

[Service]
User=root
Group=root
WorkingDirectory=/usr/src/python3.9-venv/
Environment=PATH=/usr/src/python3.9-venv/bin
ExecStart=/bin/sh -c 'cd /usr/src/python3.9-venv/ && source /usr/src/python3.9-venv/bin/activate && python3.9 /usr/src/python3.9-venv/welcomer.py'
Restart=on-failure

[Install]
WantedBy=multi-user.target

@federico-razzoli
Copy link

VIRTUAL_ENV=/home/path/to/venv

@shoguevara you claim that your snippet is tested and works, but this line is not valid syntax.

@shoguevara
Copy link

VIRTUAL_ENV=/home/path/to/venv

@shoguevara you claim that your snippet is tested and works, but this line is not valid syntax.

Worked by the time I've tested it. Moved on since then, I cant even recall what app I was wrapping that time.

@andreabenini
Copy link

Do not use VIRTUAL_ENV var to specify the path, SystemD might complain, use PATH directly and also add /bin/ at the end of it, with your example it might be something like:

...
Environment=PATH=/home/path/to/venv/bin:$PATH
...

@andreabenini
Copy link

@federico-razzoli
Copy link

@andreabenini I don't do it, I just pointed out that it's not valid syntax (Environment= is missing). In my case, systemd didn't complain about that variable, but using it changed nothing. PATH was also not a problem.

@annahri
Copy link

annahri commented Feb 7, 2024

Systemd won't expand variables mentioned in Environment=

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment