Сервис systemd не удается запустить скрипт в домашнем каталоге

Вопрос или проблема

Я хотел бы запустить Python-скрипт (то есть сервер Flask) при загрузке Ubuntu 22.04. Я создал файл /lib/systemd/system/myService.service со следующим содержимым:

[Unit]
Description=Служба запускает сервер Flask

[Service]
User=myUsername
ExecStart=/home/myUsername/PycharmProjects/myProject/server/server.sh

[Install]
WantedBy=multi-user.target

server.sh содержит следующее содержимое:

#!/bin/bash
eval "$(conda shell.bash hook)"
conda activate huggingface
python server.py

Когда я запускаю службу, я получаю следующую ошибку:

Mar 28 02:04:39 myComputer systemd[1]: Запущена myService.
Mar 28 02:04:39 myComputer  systemd[1713428]: myService.service: Не удалось найти исполняемый файл /home/myUsername/PycharmProjects/myProject/server/server.sh: Доступ запрещен
Mar 28 02:04:39 myComputer  systemd[1713428]: myService.service: Не удалось на шаге EXEC создать процесс /home/myUsername/PycharmProjects/myProject/server/server.sh: Доступ запрещен
Mar 28 02:04:39 myComputer  systemd[1]: myService.service: Основной процесс завершился, код=выход, статус=203/EXEC
Mar 28 02:04:39 myComputer  systemd[1]: myService.service: Завершено с результатом 'код-выхода'.

Когда я запускаю server.sh непосредственно, он работает, так что проблема в службе. Я думаю, что проблема может заключаться в том, что я хочу запустить скрипт в своей домашней директории.

Есть ли возможность заставить службу запускать server.sh в моей домашней директории? Я не хочу перемещать его вне своей домашней директории, так как другие пользователи имеют доступ к компьютеру, и они не должны иметь доступ к файлам.

У меня была точно такая же проблема. Я решил её, открыв терминал и выполнив:

sudo setenforce 0

Ответ или решение

Чтобы разрешить ошибку запуска вашего скрипта в системе Ubuntu 22.04 с использованием systemd, необходимо учесть несколько важных аспектов, касающихся как прав доступа, так и конфигурации самой службы. Давайте рассмотрим последовательность действий для успешного запуска вашего Python-скрипта Flask.

1. Проверка прав доступа

Ошибка с сообщением "Permission denied" часто связана с недостаточными правами на выполнение вашего скрипта server.sh. Убедитесь, что этот файл является исполняемым:

chmod +x /home/myUsername/PycharmProjects/myProject/server/server.sh

2. Установка правильного пути к bash

При инициализации службы systemd важно указать полный путь к интерпретатору команд, который будет запускать ваш скрипт. В разделе [Service] можно добавить строку для установки переменной окружения:

[Service]
User=myUsername
ExecStart=/bin/bash /home/myUsername/PycharmProjects/myProject/server/server.sh

Убедитесь, что используете полный путь к интерпретатору, например, /bin/bash, в случае если ваш скрипт использует bash.

3. Установка окружения

Так как вы используете Conda для активации окружения, убедитесь, что запуск conda activate huggingface происходит корректно. В некоторых случаях, для того чтобы скрипт корректно выполнялся в сервисах systemd, может потребоваться указание переменных окружения, необходимых для Conda, непосредственно в файле сервиса:

[Service]
User=myUsername
Environment="PATH=/home/myUsername/miniconda3/bin:$PATH"
ExecStart=/bin/bash /home/myUsername/PycharmProjects/myProject/server/server.sh

4. Установка SELinux (если применимо)

Вы упомянули, что ошибка была решена временным отключением SELinux командой sudo setenforce 0. Однако следует обратить внимание, что это не рекомендуется как постоянное решение, так как это снижает уровень безопасности системы. Позаботьтесь о правильной настройке политик SELinux, если он используется.

5. Изменение рабочего каталога

Если вашему скрипту требуется определённый рабочий каталог, его можно указать в файле myService.service:

WorkingDirectory=/home/myUsername/PycharmProjects/myProject/server

6. Проверка логов

Для диагностики ошибок используйте команды journalctl для просмотра журналов, связанных с вашим сервисом:

journalctl -u myService.service

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

Заключение

После выполнения вышеперечисленных шагов не забудьте перезагрузить конфигурацию systemd и запустить свою службу:

sudo systemctl daemon-reload
sudo systemctl start myService.service

Если после всех указанных изменений проблема всё еще сохраняется, обратитесь к логам для дальнейшего анализа или проверьте, нет ли других сервисов, которые могут блокировать выполнение вашего скрипта. Эти рекомендации помогут вам успешно запустить ваш Flask-сервер при загрузке системы, сохраняя доступ из вашего домашнего каталога и не снижая безопасность системы.

Оцените материал
Добавить комментарий

Капча загружается...