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

8

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

(environment) python run.py

Eu quero executar este script no começo. (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 consegui executar qualquer script que não esteja 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)
    
por Jasmine 19.12.2016 / 13:58

1 resposta

12

Seu arquivo de unidade está correto. Se você quer rodar qualquer arquivo python sob um venv você só precisa referenciar o 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 é o motivo pelo qual sua unidade falha: code=exited, status=200/CHDIR . Isso provavelmente indica um problema no seu script.

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

  1. Execute o comando que você adicionou a ExecStart= exatamente como na raiz para ver, se o problema for causado por seu script.
  2. Se isso ocorrer sem erros, examine o diário com journalctl -u <unit_name> . Isso deve lhe dar mais algumas informações sobre problemas com sua unidade.

Post Scriptum

As duas opções de [Service] 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 no seu script são executadas a partir de diretórios diferentes. Portanto, se o seu script contiver uma linha open("my_file", "w") , no primeiro exemplo, criará um arquivo /my_file e o segundo um arquivo /home/user/space/my_file .

    
por 20.12.2016 / 12:11