Вопрос или проблема
Я хотел бы запустить 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-сервер при загрузке системы, сохраняя доступ из вашего домашнего каталога и не снижая безопасность системы.