-
-
Save ricferr/90583f608f0b0ae9c3cf6833be04ab85 to your computer and use it in GitHub Desktop.
[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 |
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
How do we then deactivate with ExecStop?
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.
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.
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
Thank you this helped me solve an issue I was having!
[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
VIRTUAL_ENV=/home/path/to/venv
@shoguevara you claim that your snippet is tested and works, but this line is not valid syntax.
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.
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 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.
Systemd won't expand variables mentioned in Environment=
Put these in /etc/systemd/system/