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
Federico Sierra

Відповіді:


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=точно так, як під коренем, щоб побачити, чи проблема викликана вашим сценарієм.
  2. Якщо це працює без помилок, погляньте на журнал journalctl -u <unit_name>. Це повинно дати вам більше інформації про проблеми з вашим підрозділом.

Post Scriptum

Обидва наступні [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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.