systemd не может запустить скрипт, который в остальном работает нормально?

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

У меня есть API на golang, который должен работать 24/7 для обратного прокси nginx.

У меня есть скрипт..

#!/usr/bin/bash
cd /root/api && go run .

Он работает нормально вручную.

Но /etc/systemd/system/api.service не удается запустить.

.service:

[Unit]
Description=API на go для фронтенда www

[Service]
Type = simple
ExecStart=/root/api.sh

Статус systemctl сообщает

× api.service - API на go для фронтенда www
     Loaded: loaded (/etc/systemd/system/api.service; static)
     Active: failed (Result: exit-code) since Thu 2024-11-21 18:55:03 UTC; 2min 17s ago
   Duration: 118ms
 Invocation: e6e602afee2b4bf6b2d623c15fcbb65e
    Process: 343565 ExecStart=/root/api.sh (code=exited, status=1/FAILURE)
   Main PID: 343565 (code=exited, status=1/FAILURE)
   Mem peak: 2.8M
        CPU: 50ms

Как говорит Jaromanda, вы должны сказать systemd, когда запускать это. Также следует указать, ГДЕ находится исполняемый файл go (но вместо того, чтобы указывать путь к exe, лучше настроить PATH в окружении, например, Environment="PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin" под [Service]).

Также вам следует научиться проверять ваши логи, когда что-то идет не так.

И вам не следует устанавливать сервисы в домашнюю директорию root, НИ бежать открытые сервисы под root!

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

Пошаговое решение проблемы с запуском скрипта через systemd

Если у вас возникли проблемы с запуском вашего скрипта на Golang с помощью systemd, несмотря на то что он работает корректно при ручном запуске, необходимо осознать ряд факторов, которые могут повлиять на его выполнение. Ниже представлены рекомендации по решению данной проблемы с учётом всех ключевых аспектов.

1. Проверка службы и её конфигурации

Ваша служба api.service выглядит следующим образом:

[Unit]
Description=A go-lang API for the www frontend

[Service]
Type=simple
ExecStart=/root/api.sh

Убедитесь, что файл api.sh имеет правильные разрешения для выполнения (например, chmod +x /root/api.sh). Однако, запуск скриптов и сервисов из директории /root не является безопасным и не рекомендуется.

2. Указание окружения

Для корректного функционирования Golang-приложения рекомендуется явно задать переменную окружения PATH. Это может быть выполнено следующим образом:

[Service]
Type=simple
Environment="PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
ExecStart=/root/api.sh

Также можно рассмотреть возможность указания полного пути к исполняемому файлу Go, если это требуется.

3. Логи и отладка

Для диагностики ошибок необходимо просмотреть системные журналы. Воспользуйтесь следующими командами для получения информации о статусе службы и её логах:

systemctl status api.service
journalctl -u api.service -b

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

4. Изменение положения скрипта

Рекомендуется разместить ваш скрипт в более безопасном месте, например, в директории /usr/local/bin или /opt/api. Это также может повысить безопасность системы:

mv /root/api.sh /usr/local/bin/api.sh

После этого обновите ExecStart в вашем файле конфигурации службы:

ExecStart=/usr/local/bin/api.sh

5. Запуск под другим пользователем

Запуск сервисов от имени пользователя root может быть небезопасным. Лучше создать нового пользователя для запуска вашего приложения:

adduser --system --no-create-home apiuser

Затем обновите ваш файл службы для указания пользователя:

[Service]
User=apiuser

6. Пример окончательной конфигурации

Вот как может выглядеть итоговая конфигурация вашего сервиса:

[Unit]
Description=A go-lang API for the www frontend

[Service]
Type=simple
User=apiuser
Environment="PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
ExecStart=/usr/local/bin/api.sh
Restart=always

[Install]
WantedBy=multi-user.target

7. Применение изменений

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

systemctl daemon-reload
systemctl start api.service
systemctl enable api.service

Заключение

Следуя вышеизложенным рекомендациям, вы сможете устранить проблемы с запуском вашего Golang API через systemd. Обязательно тестируйте изменения и регулярно проверяйте журнал, чтобы обеспечить стабильную работу сервиса.

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

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