Вопрос или проблема
Служба systemd завершает работу немедленно (ошибка 203), но запускается нормально в отдельном режиме?
Я написал небольшое приложение (ELF-бинарник), которое слушает TCP/IP соединения, и оно работает нормально, когда я запускаю его из командной строки, но когда я использую systemd, возникает ошибка с кодом 203.
Вот мой файл службы:
[Unit]
Description=Демон службы удаленного ввода
[Service]
ExecStart=/home/sofakng/risd/risd
[Install]
WantedBy=multi-user.target
Вот статус от systemd, когда я пытаюсь его запустить:
× risd.service - Демон службы удаленного ввода
Loaded: loaded (/etc/systemd/system/risd.service; disabled; preset: disabled)
Drop-In: /usr/lib/systemd/system/service.d
└─10-timeout-abort.conf
Active: failed (Result: exit-code) since Sat 2024-09-21 22:06:38 EDT; 2min 24s ago
Duration: 1ms
Process: 18247 ExecStart=/home/sofakng/risd/risd (code=exited, status=203/EXEC)
Main PID: 18247 (code=exited, status=203/EXEC)
CPU: 532us
Sep 21 22:06:38 bazzite systemd[1]: Started risd.service - Демон службы удаленного ввода.
Sep 21 22:06:38 bazzite systemd[1]: risd.service: Основной процесс завершился, код=exited, статус=203/EXEC
Sep 21 22:06:38 bazzite systemd[1]: risd.service: Не удалось завершиться с результатом 'exit-code'.
Тем не менее, когда я запускаю бинарный файл из командной строки, он работает идеально. Я могу запустить его как я сам, так и под root, и в обоих случаях он работает нормально. Я проверил права на файл (a+x), и я не понимаю, почему это не работает.
Ответ или решение
Ошибка 203, возникающая при запуске вашей службы systemd, указывает на проблему с исполнением исполняемого файла. Несмотря на то что ваше приложение работает корректно при запуске из командной строки, в окружении systemd могут возникать различные ограничения и условия, которые необходимо учитывать.
Вот несколько возможных причин возникновения этой ошибки и пути их устранения:
-
Проблемы с исполняемым файлом:
- Убедитесь, что ваш исполняемый файл действительно является ELF-файлом и не поврежден. Вы можете проверить это с помощью команды
file /home/sofakng/risd/risd
. - Убедитесь, что у вашего исполняемого файла есть необходимые права доступа. Важно, чтобы файл был исполняемым (права
a+x
).
- Убедитесь, что ваш исполняемый файл действительно является ELF-файлом и не поврежден. Вы можете проверить это с помощью команды
-
Проблемы с зависимостями:
- Проверьте, требуются ли вашему приложению какие-либо специфические библиотеки или зависимости, которые могут быть недоступны в окружении systemd. Попробуйте запустить
ldd /home/sofakng/risd/risd
, чтобы увидеть, не отсутствует ли какой-нибудь из требуемых файлов.
- Проверьте, требуются ли вашему приложению какие-либо специфические библиотеки или зависимости, которые могут быть недоступны в окружении systemd. Попробуйте запустить
-
Проблемы с окружением:
- При запуске через systemd ваше приложение работает в другом окружении, чем в терминале. Проверьте, не ожидает ли ваше приложение, что некоторые переменные окружения будут установлены. Вы можете явно установить переменные окружения в секции
[Service]
вашего файла службы, добавив строки, например:Environment=VAR_NAME=value
- При запуске через systemd ваше приложение работает в другом окружении, чем в терминале. Проверьте, не ожидает ли ваше приложение, что некоторые переменные окружения будут установлены. Вы можете явно установить переменные окружения в секции
-
Контроль ошибок:
- Чтобы детально проверить, что происходит при запуске службы, добавьте отладочную информацию. Измените файл службы, добавив
StandardOutput
иStandardError
:[Service] ExecStart=/home/sofakng/risd/risd StandardOutput=journal StandardError=journal
- После этого, проверьте журнал systemd с помощью команды
journalctl -u risd.service
для получения детальной информации о том, что происходит при запуске.
- Чтобы детально проверить, что происходит при запуске службы, добавьте отладочную информацию. Измените файл службы, добавив
-
Использование полного пути:
- Убедитесь, что вы указываете полный путь к исполняемому файлу и что он корректен.
- Отладка с
sudo
:- Иногда службы systemd могут вести себя иначе, если они запускаются от имени пользователя с меньшими привилегиями. Попробуйте изменить пользователя, под которым выполняется служба, с помощью директивы
User=
в файле службы:[Service] User=ваше_имя_пользователя ExecStart=/home/sofakng/risd/risd
- Иногда службы systemd могут вести себя иначе, если они запускаются от имени пользователя с меньшими привилегиями. Попробуйте изменить пользователя, под которым выполняется служба, с помощью директивы
После применения вышеперечисленных рекомендаций попробуйте перезапустить вашу службу с помощью команд:
sudo systemctl daemon-reload
sudo systemctl restart risd.service
Затем проверьте статус службы снова. Надеюсь, что эти советы помогут вам устранить ошибку 203 и успешно запустить ваше приложение через systemd.