Вопрос или проблема
Это мой первый опыт создания bash-скрипта в сервис, и я столкнулся с ошибкой, при которой сервис не может открыть текстовый файл, используемый для аргументов Java (user_jvm_args.txt). Я предполагаю, что это связано с какой-то проблемой с правами доступа, но я в замешательстве. Все советы будут полезны, так как я стараюсь стать лучше и учиться. Спасибо!
Вот файл сервиса:
[Service]
ExecStart=/home/ethan/ATM9-Server/run.sh
Вот bash-скрипт run.sh:
#!/usr/bin/env sh
java @user_jvm_args.txt @libraries/net/minecraftforge/forge/1.20.1-47.1.3/unix_args.txt "$@"
Вот файл user_jvm_args.txt, который находится в той же папке, что и скрипт run.sh:
# Xmx и Xms задают максимальное и минимальное использование ОЗУ соответственно.
# Они могут принимать любое число, за которым следует M или G.
# M означает мегабайт, G означает гигабайт.
# Например, чтобы установить максимум на 3GB: -Xmx3G
# Чтобы установить минимум на 2.5GB: -Xms2500M
# Хороший стандарт для модифицированного сервера - 4GB.
-Xms1G
-Xmx10G
-XX:+UseG1GC
-XX:+ParallelRefProcEnabled
-XX:MaxGCPauseMillis=200
-XX:+UnlockExperimentalVMOptions
-XX:+DisableExplicitGC
-XX:+AlwaysPreTouch
-XX:G1NewSizePercent=30
-XX:G1MaxNewSizePercent=40
-XX:G1HeapRegionSize=8M
-XX:G1ReservePercent=20
-XX:G1HeapWastePercent=5
-XX:G1MixedGCCountTarget=4
-XX:InitiatingHeapOccupancyPercent=15
-XX:G1MixedGCLiveThresholdPercent=90
-XX:G1RSetUpdatingPauseTimePercent=5
-XX:SurvivorRatio=32
-XX:+PerfDisableSharedMem
-XX:MaxTenuringThreshold=1
Большинство из них – это значения по умолчанию, и единственные, которые я изменил, это -Xms и -Xmx.
Вот ошибка, которая возникает, как видно из журналов:
Nov 03 15:44:43 ATM9-Server-Temp systemd[1]: Started run.service.
Nov 03 15:44:43 ATM9-Server-Temp run.sh[12480]: Error: could not open `user_jvm_args.txt'
Nov 03 15:44:43 ATM9-Server-Temp systemd[1]: run.service: Main process exited, code=exited, status=1/FAILURE
Nov 03 15:44:43 ATM9-Server-Temp systemd[1]: run.service: Failed with result 'exit-code'.
Как выяснилось, добавив пользователя, группу и рабочий каталог, я смог запустить его без проблем!
Ответ или решение
Ошибки, связанные с доступом к файлам и их открытием в Unix-системах, часто вызывают затруднения. В вашем случае вы получаете ошибку could not open user_jvm_args.txt
, что указывает на наличие проблем с доступом к файлу параметров JVM. Давайте разберемся с тем, как можно решить эту проблему и оптимизировать вашу настройку сервиса.
Проблема
Текущая ошибка происходит, потому что ваш скрипт run.sh
не может открыть файл user_jvm_args.txt
, который находится в той же директории. Это, скорее всего, связано с неправильной конфигурацией сервиса systemd или недостаточными правами доступа.
Решение
-
Проверка прав доступа:
Убедитесь, что файлuser_jvm_args.txt
и скриптrun.sh
доступны для чтения пользователю, под которым запускется ваш сервис. Выполните следующую команду для проверки прав доступа:ls -l /home/ethan/ATM9-Server/
Убедитесь, что у владельца или группы есть права на чтение (r) для обоих файлов.
-
Добавление пользователя и рабочей директории в файл сервиса:
Как вы уже выяснили, добавление параметров пользователя (User), группы (Group), а также рабочего каталога (WorkingDirectory) в файл вашего сервиса systemd может устранить проблему. Вот как может выглядеть обновленный файл сервиса:[Unit] Description=ATM9 Server [Service] User=your_username Group=your_groupname WorkingDirectory=/home/ethan/ATM9-Server ExecStart=/home/ethan/ATM9-Server/run.sh [Install] WantedBy=multi-user.target
Замените
your_username
иyour_groupname
на актуальные значения для вашего пользователя и его группы. -
Перезагрузка конфигурации сервиса:
После внесения изменений в файл сервиса необходимо перезагрузить конфигурацию systemd:sudo systemctl daemon-reload
-
Запуск/Перезапуск сервиса:
Теперь вы можете попробовать запустить сервис:sudo systemctl start run.service
Или, если он уже запущен, перезапустить его:
sudo systemctl restart run.service
-
Проверка статуса сервиса:
Чтобы убедиться, что сервис запустился без ошибок, проверьте его статус:sudo systemctl status run.service
Заключение
Проблемы с доступом к файлам могут быть вызваны множеством факторов, но, как правило, они легко решаются с помощью правильной конфигурации прав доступа и параметров запуска сервиса. Добавление пользователя, группы и рабочей директории в ваш файл сервиса – это оптимальное решение, которое поможет избежать подобных ошибок в будущем и улучшит управляемость вашего сервиса.
Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью. Успехов в вашем проекте!