Как настроить запуск скрипта Python3 в Linux как службы с использованием systemd так, чтобы избежать проблем с импортом библиотек при запуске?
Существует несколько причин, по которым скрипт на Python может работать самостоятельно, но не запускаться в качестве службы. Некоторые из них могут быть связаны с различиями в окружении (например, абсолютные и относительные пути к файлам и библиотекам), разрешениями доступа к файлам, наличием внешних зависимостей, правами пользователя при запуске службы и т. д. Чтобы настроить запуск скрипта Python3 в Linux как службы с использованием systemd и избежать проблем с импортом библиотек, следуйте этим шагам: 1. Создайте новый файл с расширением .service в папке /etc/systemd/system/. Например, /etc/systemd/system/my_python_script.service. 2. В открывшемся файле укажите параметры запуска для вашего скрипта. Например: ``` [Unit] Description=My Python Script After=network.target [Service] User=your_username WorkingDirectory=/path/to/your/script ExecStart=/usr/bin/python3 my_script.py Restart=always [Install] WantedBy=multi-user.target ``` 3. Перезапустите systemd, чтобы подхватить изменения: ``` sudo systemctl daemon-reload ``` 4. Запустите службу и добавьте её в автозапуск: ``` sudo systemctl start my_python_script sudo systemctl enable my_python_script ``` Теперь ваш скрипт Python3 должен запускаться как служба без проблем с импортом библиотек. Помните также, что важно убедиться, что все необходимые библиотеки установлены в виртуальном окружении или глобально в системе, чтобы избежать ошибок импорта.
Виртуальное окружение в проекте есть? Если да, то запускать скрипт надо не системным питоном, а питоном из этого окружения.
EDIT1:
Если из командной строки дать pyhon3 /home/lxm213/script.py, то скрипт работает штатно и без ошибок
Т.е. скрипт запускаешь в системном окружении, а не в виртуальном. ОК, тогда по идее он должен работать...
Но встаёт вопрос: как ты ставил schedule? Простоpip install schedule
? Из-под рута ставил или с правами просто пользователя?
Если ставил из-под рута, то библиотека будет установлена в системный интерпретатор и будет доступна всем пользователям.
Если ставил не из-под рута, то, возможно, pip поставил её куда-то в твой домашний каталог - я знаю, что под виндой он так делает. Тогда библиотека доступна только если запускать скрипт из-под твоего пользователя.
Отсюда три возможных решения:
1. Создать виртуальное окружение для проекта, поставить библиотеку в это виртуальное окружение (используя местный pip), запускать скрипт через python3 из этого окружения.
2. Если библиотека была поставлена без рут-прав, указать в .service-файле, что скрипт надо запускать от имени твоего пользователя, а не от имени root.
3. Убедиться, что библиотека поставлена в системный интерпретатор. При необходимости поставить её с рут-правами. Тогда скрипт будет работать из-под любого пользователя.
Ответ ИИ...
Доброго дня! Судя по описанию, проблема может быть связана с окружением, в котором запускается скрипт при старте службы. Есть несколько моментов, на которые стоит обратить внимание:
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
Сами служба и скрипт запускались, но скрипт был остановлен из-за ошибки импорта питоновской(!) библиотеки.ну так это библиотеку надо установить, ты это сделал? И вообще разберись с виртуальным окружением в python.
В файле сервиса перед запуском скрипта добавь команду cd для перехода в директорию со скриптом.
Попробуйте запустить скрипт из под администратора
Скорей всего часть библиотек стоит под пользователем, и их надо доставить для su