Systemd: executar um script Python na inicialização (virtualenv)

11

Eu tenho um script python que eu normalmente o executo com este comando:

(environment) python run.py

Eu quero executar este script no início. (Estou usando o ubuntu) Aqui está o meu serviço:

[Unit]
Description=My Script Service
After=multi-user.target

[Service]
Type=idle

ExecStart=/home/user/anaconda3/bin/python /home/user/space/run.py

[Install]
WantedBy=multi-user.target

BTW, não consegui executar este script, mas poderia executar qualquer script que não estivesse dentro do ambiente. Como posso executar um script python na inicialização (virtualenv)?

sudo systemctl status user_sent
● user_sent.service - Mail Service
Loaded: loaded (/lib/systemd/system/user_sent.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since xxxxx 16:30:20 MSK; 3s ago
Process: 3713 ExecStart=/usr/bin/python run.py (code=exited,   status=200/CHDIR)
Main PID: 3713 (code=exited, status=200/CHDIR)
Jasmim
fonte
1
O que dizem logs e status?
Federico Sierra
Eu editei minha pergunta. Muito obrigado @FedericoSierra
Jasmine
1
O script é executado fora do venv, /usr/bin/python run.pyconsulte stackoverflow.com/questions/37211115/… e unix.stackexchange.com/questions/278188/…
Federico Sierra
Eu tentei eles. Eu tenho que correr "run.py python" não "/user_sent/run.py python"
Jasmine
1
O caminho do python deve apontar para a versão dentro do ambiente virtual, por exemplo/path/to/your/virtualenv/bin/python
Federico Sierra

Respostas:

14

O arquivo da sua unidade está correto. Se você deseja executar qualquer arquivo python em um venv, basta fazer referência ao binário python no diretório venv , como você fez com/home/user/anaconda3/bin/python

[Unit]
Description=My Script Service
After=multi-user.target

[Service]
Type=idle

ExecStart=/home/user/anaconda3/bin/python /home/user/space/run.py

[Install]
WantedBy=multi-user.target

O que se destaca é a razão sua unidade falhar: code=exited, status=200/CHDIR. Provavelmente, isso indica um problema no seu script.

Se você deseja depurar isso, faça o seguinte:

  1. Execute o comando que você adicionou ExecStart=exatamente como esse em root para ver se o problema foi causado pelo seu script.
  2. Se isso for executado sem erros, consulte o diário com journalctl -u <unit_name>. Isso deve fornecer mais informações sobre problemas com sua unidade.

Post Scriptum

As duas [Service]opções a seguir funcionam:

ExecStart=/home/user/anaconda3/bin/python /home/user/space/run.py

ou

WorkingDirectory=/home/user/space
ExecStart=/home/user/anaconda3/bin/python run.py

A única diferença é que as chamadas relativas em seu script são executadas em diretórios diferentes. Portanto, se seu script contiver uma linha open("my_file", "w"), no primeiro exemplo, ele criará um arquivo /my_filee o segundo, um arquivo /home/user/space/my_file.

Daniel
fonte