- Вопрос или проблема
- Ответ или решение
- Пошаговое решение проблемы с запуском скрипта через systemd
- 1. Проверка службы и её конфигурации
- 2. Указание окружения
- 3. Логи и отладка
- 4. Изменение положения скрипта
- 5. Запуск под другим пользователем
- 6. Пример окончательной конфигурации
- 7. Применение изменений
- Заключение
Вопрос или проблема
У меня есть 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. Обязательно тестируйте изменения и регулярно проверяйте журнал, чтобы обеспечить стабильную работу сервиса.