Задать вопрос

Как внедрить golang/beego в автозагрузку (systemd, upstart, supervisor) vps linux?

Всем привет, подскажите, кто знает. Поставил golang все отлично работает и приложение beego запускается, пробовал добавить в автозагрузку по разным туториалом, в том числи и на японском, прописывал следующее

upstart

description "A stupid golang http listener"

start on filesystem or runlevel [2345]
stop on runlevel [!2345]

setuid www-data
setgid www-data

respawn
respawn limit 5 2

exec /root/home/src/hello/hello


пробовал еще так
exec ~/home/src/hello/hello
exec go run /root/home/src/hello/main.go

никак не запускается, хотя просто из консоли, все работает

в systemd пробовал так

[Unit]
Description=Webhook
[Service]
User=deployer
Group=www-data
Restart=on-failure
ExecStart=/root/home/src/hello/hello

[Install]
WantedBy=multi-user.target


в первом и втором случае, все хорошо добавляется, как сервис, но при запуске пишут ошибки, очень запомнилось failure и коды, вроде 207

в supervisor вообще не добавился, писал так

[program:yourapp]
command=/root/home/src/hello/hello # the location of your app
autostart=true
autorestart=true
startretries=10
user=yourappuser # the user your app should run as (i.e. *not* root!)
directory=/ root/home/src/hello/ # where your application runs from
environment=APP_SETTINGS="/srv/www/yourapp.com/prod.toml" # environmental variables
redirect_stderr=true
stdout_logfile=/var/log/supervisor/yourapp.log # the name of the log file.
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10


Все время думал, что дело в памяти, хотя на на моем openvz 384мб, а beego жрет примерно 20мб, странно как-то, кто знает, в чем может быть проблема?
  • Вопрос задан
  • 2980 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
xotkot
@xotkot
хорошо есть и хорошо весьма
для systemd

юнит:
$ systemctl --user cat test.service

# /home/admin/.config/systemd/user/test.service
[Unit]
After=local-fs.target network.target

[Service]
Type=simple
ExecStart=/home/admin/code/go/bin/test
Restart=on-failure
RestartSec=60
TimeoutSec=60

[Install]
WantedBy=default.target

After - после каких сервисов или их групп запускать юнит. В данном случае запускать не раньше чем будет смонтированна локальная файловая система и доступна сеть.
RestartSec - сколько секунд ждать между перезапуском юнит-сервиса(по умолчанию 100мс).
TimeoutSec - сколько секунд ждать обработки start/stop запроса по истечении которых считать что процесс завершился с ошибкой (программа не успела поднятся/остановится за отведённое ей время).

автозагрузка и запуск:
$ systemctl --user enable test.service
$ systemctl --user start test.service


статус:
$ systemctl --no-pager --full --user status test.service


перезагрузка systemd для поиска новых или изменённых юнитов:
$ systemctl --user daemon-reload
проделывается после изменения описания юнитов в процессе их работы, об этом также будет выведено сообщение(в конце) при описании статуса изменённого сервиса.

перезапуск web-сервера(после перекомпиляции):
$ systemctl --user restart test.service

здесь test.service(юнит-сервис) и test(веб-сервер на go) принадлежат пользователю admin (/home/admin/.config/systemd/user/test.service). В бщем кому принадлежит и кто может работать с юнит-сервисом я уже писал в одном из постов.

п.с.
если пользователь находится на сервере то скорее всего вам еще понадобится перевести его статус в linger, то есть чтобы он всегда подымался при старте системы(как и root):
# loginctl enable-linger <username>
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@seys Автор вопроса
сделал все, как Вы написали, в Вашем случае, у меня выдало такое сообщение

Failed to get D-Bus connection: Connection refused

еще попробовал по этому туториалу

в этом случае консоль пишет следующее

root@free:/opt# service listener status
● listener.service - Webhook
   Loaded: loaded (/etc/systemd/system/listener.service; enabled)
   Active: failed (Result: start-limit) since Fri 2016-08-26 20:46:12 EDT; 6s ago
  Process: 4536 ExecStart=/opt/listen (code=exited, status=217/USER)
 Main PID: 4536 (code=exited, status=217/USER)

Aug 26 20:46:12 free systemd[1]: Unit listener.service entered failed state.
Aug 26 20:46:12 free systemd[1]: listener.service holdoff time over, sche...t.
Aug 26 20:46:12 free systemd[1]: Stopping Webhook...
Aug 26 20:46:12 free systemd[1]: Starting Webhook...
Aug 26 20:46:12 free systemd[1]: listener.service start request repeated ...t.
Aug 26 20:46:12 free systemd[1]: Failed to start Webhook.
Aug 26 20:46:12 free systemd[1]: Unit listener.service entered failed state.
Hint: Some lines were ellipsized, use -l to show in full.


P.S. Я видимо мало спал, но ваш вариант работает. Вытащил из этого туториала команду, которая мне помогла

ввел

systemctl daemon-reload

и ваш вариант загрузился. У меня остались косяки по поехавшему шаблону, но это мелочи и я все исправлю. Благодарю Вас за помощь!!! Если бы не Вы, сегодня писал бы под node.js

странно, что второй вариант, что из примера выше, так и не работает, пишет тоже самое

я так и не понял в чем проблема была и как я ее исправил, если можете, объясните суть, чтобы до меня дошло, не хочу как-то тупо копировать код, чтобы просто работало.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы