Назад | Перейти на главную страницу

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

У меня есть сценарий 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)

Ваш юнит-файл правильный. Если вы хотите запустить любой файл 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.