@lx-noobe

Почему питоновский скрипт сам по себе рабочий, а в виде службы — нет?

Доброго дня, уважаемое сообщество!
Есть задача ежедневно постить в Телеграме фотографии. Для этого был сочинён скрипт на python3, который заработал как задумывалось на Win10, а затем перенесён на LinuxMint21.3, где тоже отработал штатно, если его запускать просто как скрипт.
Для обеспечения надёжной работы на Linux (главная платформа проекта) решил оформить запуск скрипта через службу, т.е. если сервер уходит в перезагрузку, то после восстановления скрипт д.б. загружен на исполнение автоматически. Создание службы делал по материалу, данному по этому адресу . Однако, пройдя по всем шагам руководства, при проверке статуса службы получил облом. Сами служба и скрипт запускались, но скрипт был остановлен из-за ошибки импорта питоновской(!) библиотеки. Для проверки даже давал полные права и на скрипт, и на файл службы – безрезультатно.
Итого: при обычном запуске скрипта всё отрабатывается штатно, без проблем с импортом, а в виде службы скрипт не может импортировать библиотеку и останавливается.
Сам я с Linux знаком очень поверхностно, да и Python вот только начал осваивать…
Уважаемые, может кто подсказать куда копать и на что обратить внимание?

Вот что выдаёт запрос на статус службы telegram-bot.service:
telegram-bot.service - Telegram bot
     Loaded: loaded (/etc/systemd/system/telegram-bot.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Thu 2024-06-27 11:01:43 MSK; 46min ago
   Main PID: 554 (code=exited, status=1/FAILURE)
        CPU: 407ms

июн 27 11:01:19 lxm213-pc systemd[1]: Started Telegram bot.
июн 27 11:01:43 lxm213-pc python3[554]: Traceback (most recent call last):
июн 27 11:01:43 lxm213-pc python3[554]:   File "/home/lxm213/2_test_sched_run.py", line 4, in <module>
июн 27 11:01:43 lxm213-pc python3[554]:     import schedule
июн 27 11:01:43 lxm213-pc python3[554]: ModuleNotFoundError: No module named 'schedule'
июн 27 11:01:43 lxm213-pc systemd[1]: telegram-bot.service: Main process exited, code=exited, status=1/FAILURE
июн 27 11:01:43 lxm213-pc systemd[1]: telegram-bot.service: Failed with result 'exit-code'.
июн 27 11:09:50 lxm213-pc systemd[1]: /etc/systemd/system/telegram-bot.service:3: Failed to add dependency on network.targer, ignoring: Invalid argument
июн 27 11:10:36 lxm213-pc systemd[1]: /etc/systemd/system/telegram-bot.service:3: Failed to add dependency on network.targer, ignoring: Invalid argument
  • Вопрос задан
  • 6718 просмотров
Решения вопроса 2
Vindicar
@Vindicar
RTFM!
Виртуальное окружение в проекте есть? Если да, то запускать скрипт надо не системным питоном, а питоном из этого окружения.
EDIT1:
Если из командной строки дать pyhon3 /home/lxm213/script.py, то скрипт работает штатно и без ошибок

Т.е. скрипт запускаешь в системном окружении, а не в виртуальном. ОК, тогда по идее он должен работать...
Но встаёт вопрос: как ты ставил schedule? Просто pip install schedule? Из-под рута ставил или с правами просто пользователя?
Если ставил из-под рута, то библиотека будет установлена в системный интерпретатор и будет доступна всем пользователям.
Если ставил не из-под рута, то, возможно, pip поставил её куда-то в твой домашний каталог - я знаю, что под виндой он так делает. Тогда библиотека доступна только если запускать скрипт из-под твоего пользователя.

Отсюда три возможных решения:
1. Создать виртуальное окружение для проекта, поставить библиотеку в это виртуальное окружение (используя местный pip), запускать скрипт через python3 из этого окружения.
2. Если библиотека была поставлена без рут-прав, указать в .service-файле, что скрипт надо запускать от имени твоего пользователя, а не от имени root.
3. Убедиться, что библиотека поставлена в системный интерпретатор. При необходимости поставить её с рут-правами. Тогда скрипт будет работать из-под любого пользователя.
Ответ написан
@FlyGst
Ответ ИИ...

Доброго дня! Судя по описанию, проблема может быть связана с окружением, в котором запускается скрипт при старте службы. Есть несколько моментов, на которые стоит обратить внимание:

1. **Путь до интерпретатора Python**: Убедитесь, что в вашем unit-файле для службы указан правильный путь до интерпретатора Python. Он может отличаться от того, что используется в интерактивной сессии или в вашей среде разработки.

2. **Переменные окружения**: При запуске скрипта через службу переменные окружения могут быть другими по сравнению с теми, что установлены в интерактивной сессии. Особенно это касается переменных `PYTHONPATH` и `PATH`.

3. **Виртуальное окружение**: Если вы используете виртуальное окружение для Python, убедитесь, что служба активирует его перед запуском скрипта.

Ниже приведен пример systemd unit-файла, который должен помочь решить вашу проблему:

1. Создайте файл службы, например, `/etc/systemd/system/telegram_bot.service`:

```ini
[Unit]
Description=Telegram Bot
After=network.target

[Service]
User=имя_пользователя
Group=имя_группы
WorkingDirectory=/путь/к/директории/с/скриптом
ExecStart=/usr/bin/python3 /путь/к/директории/с/скриптом/ваш_скрипт.py
Environment="PYTHONPATH=/usr/local/lib/python3.8/site-packages"

[Install]
WantedBy=multi-user.target
```

2. Если вы используете виртуальное окружение, измените `ExecStart` на следующее:

```ini
ExecStart=/путь/к/вашему/виртуальному/окружению/bin/python /путь/к/директории/с/скриптом/ваш_скрипт.py
```

3. Перезапустите systemd и включите службу:

```sh
sudo systemctl daemon-reload
sudo systemctl enable telegram_bot.service
sudo systemctl start telegram_bot.service
```

4. Проверьте статус службы для диагностики:

```sh
sudo systemctl status telegram_bot.service
```

**Дополнительные шаги**:

- Убедитесь, что все зависимости установлены в окружении, в котором запускается служба.
- Используйте логирование в вашем скрипте, чтобы лучше понимать, на каком этапе происходит сбой.

Если после этих шагов проблема остается, проверьте логи службы:

```sh
sudo journalctl -u telegram_bot.service
```

Эти действия должны помочь вам разобраться с проблемой импорта библиотек при запуске скрипта через службу.

P.S. между ```sh и ``` код для выполнения в sh
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Everything_is_bad
Сами служба и скрипт запускались, но скрипт был остановлен из-за ошибки импорта питоновской(!) библиотеки.
ну так это библиотеку надо установить, ты это сделал? И вообще разберись с виртуальным окружением в python.
Ответ написан
@kurkuruzo
В файле сервиса перед запуском скрипта добавь команду cd для перехода в директорию со скриптом.
Ответ написан
@ilye
Попробуйте запустить скрипт из под администратора
Скорей всего часть библиотек стоит под пользователем, и их надо доставить для su
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы