Systemd: запуск скрипта Python при запуске (virtualenv)

11

У меня есть сценарий Python, который я обычно запускаю с помощью этой команды:

(environment) python run.py

Я хочу запустить этот скрипт при запуске. (Я использую Ubuntu) Вот мой сервис:

[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

Кстати, я не мог запустить этот скрипт, но я мог запустить любой скрипт, который не находится внутри среды. Как я могу запустить скрипт Python при запуске (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)
жасмин
источник
1
Что говорят логи и статус?
Федерико Сьерра
Я отредактировал свой вопрос. Большое спасибо @FedericoSierra
Жасмин
1
Сценарий запущенный за пределами venv, /usr/bin/python run.pyсм stackoverflow.com/questions/37211115/... и unix.stackexchange.com/questions/278188/...
Federico Sierra
Я попробовал их. Я должен запустить "python run.py", а не "python /user_sent/run.py"
Жасмин
1
Путь к питону должен указывать на версию в виртуальной среде, например/path/to/your/virtualenv/bin/python
Федерико Сьерра

Ответы:

14

Ваш файл модуля правильный. Если вы хотите запустить любой файл python под venv, вам просто нужно сослаться на двоичный файл python в каталоге venv, как вы это делали с/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

То, что торчит, является причиной, по которой ваше устройство выходит из строя code=exited, status=200/CHDIR. Скорее всего, это указывает на проблему в вашем скрипте.

Если вы хотите отладить это, вы должны сделать следующее:

  1. Запустите добавленную команду, чтобы ExecStart=точно так же, как root, чтобы увидеть, вызвана ли проблема вашим скриптом.
  2. Если это работает без ошибок, посмотрите на журнал с journalctl -u <unit_name>. Это должно дать вам больше информации о проблемах с вашим подразделением.

Пост скриптум

Оба следующих [Service]варианта работают:

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

или

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

Разница лишь в том, что относительные вызовы в вашем скрипте выполняются из разных каталогов. Так что если ваш скрипт содержит строку open("my_file", "w"), то в первом примере он создаст файл, /my_fileа во втором - файл /home/user/space/my_file.

Даниил
источник