Script de pagina WEB Vs Systemd

1. Script de pagina WEB Vs Systemd

Gabriel Guedes
7apolochewy7

(usa Ubuntu)

Enviado em 15/03/2020 - 11:05h

Olá senhoras e senhores da tela preta,
Preciso de ajuda com uma coisa que comecei só pela curiosidade e agora to meio encucado rsrs (a duvida começa a partir do passo 4, o restante é apenas para introduzir o que fiz).
1 - Primeiramente criei uma pasta pra colocar meu ambiente GO, mkdir /goserver.
2 - Fiz um script (nano /goserver/main.go) bem simples em GO para imprimir uma frase numa pagina web no navegador:

package main

import (
"net/http"
"github.com/labstack/echo/v4"
)

func main () {
e := echo.New()
e.GET("/", catatau)
e.Logger.Fatal(e.Start(":1533"))
}

func catatau (c echo.Context) error {
return c.String(http.StatusOK, "sopa nao e janta")
}


3 - Usei o comando
go mod init server 

3.1 - e depois
go run main.go &  

A partir daqui eu já consigo acessar e visualisar "sopa nao e janta" pelo navegador com o script rodando em background.

4 - O que eu preciso é torna-lo um serviço e faze-lo rodar na inicialização do linux.
Eu sei que preciso colocar o arquivo .service em lib/systemd/system/<serviço>.service
Mas eu acredito que também preciso de um arquivo .sh para dizer o que o .service fará em durante o start | stop | restart | enable.

Obs: Estou no arch linux.
Agradeço a todos,


  


2. Re: Script de pagina WEB Vs Systemd

Rogerio
RogerDez

(usa Outra)

Enviado em 15/03/2020 - 21:37h

Faça um service do tipo:

# /etc/systemd/system/nomedoservico.service
[Unit]
Description=Copy and rename Firefox Bookmarks Exported HTML every day

[Service]
Type=oneshot
User=eumsm
ExecStart=/usr/bin/go run /use/caminho/completo/main.go


E se for para rodar par todos os usuários, acho que você pode rodar o service como root. Mas para isso, você deve arrumar o ambiente do Go para o root antes, e talvez seja melhor usar caminho completo até o arq do main.go.

Como root, depois de criar esse service em /etc/systemd/system, você deve habilitar o serviço:
# systemctl enable nomedoservico.service
# systemctl start nomedoservico.service


Se quiser, pode adicionar o parâmetro 'RemainAfterExit=yes' se ele for um daemon:
Type=oneshot: this is useful for scripts that do a single job and then exit. You may want to set RemainAfterExit=yes as well so that systemd still considers the service as active after the process has exited.


E também pode precisar adicionar
WantedBy=multi-user.target 

multi-user.target is basically the closest equivalent of classic SysVinit runlevel 3 that systemd has. When a systemd system boots up, systemd is trying to make the system state match the state specified by default.target - which is usually an alias for either graphical.target or multi-user.target.


faça uns testes..


3. Re: Script de pagina WEB Vs Systemd

Perfil removido
removido

(usa Nenhuma)

Enviado em 16/03/2020 - 10:09h

Usa o cron com a ferramenta crontab ele é bem simples.

7apolochewy7 escreveu:

Olá senhoras e senhores da tela preta,
Preciso de ajuda com uma coisa que comecei só pela curiosidade e agora to meio encucado rsrs (a duvida começa a partir do passo 4, o restante é apenas para introduzir o que fiz).
1 - Primeiramente criei uma pasta pra colocar meu ambiente GO, mkdir /goserver.
2 - Fiz um script (nano /goserver/main.go) bem simples em GO para imprimir uma frase numa pagina web no navegador:

package main

import (
"net/http"
"github.com/labstack/echo/v4"
)

func main () {
e := echo.New()
e.GET("/", catatau)
e.Logger.Fatal(e.Start(":1533"))
}

func catatau (c echo.Context) error {
return c.String(http.StatusOK, "sopa nao e janta")
}


3 - Usei o comando
go mod init server 

3.1 - e depois
go run main.go &  

A partir daqui eu já consigo acessar e visualisar "sopa nao e janta" pelo navegador com o script rodando em background.

4 - O que eu preciso é torna-lo um serviço e faze-lo rodar na inicialização do linux.
Eu sei que preciso colocar o arquivo .service em lib/systemd/system/<serviço>.service
Mas eu acredito que também preciso de um arquivo .sh para dizer o que o .service fará em durante o start | stop | restart | enable.

Obs: Estou no arch linux.
Agradeço a todos,





4. Re: Script de pagina WEB Vs Systemd

Gabriel Guedes
7apolochewy7

(usa Ubuntu)

Enviado em 18/03/2020 - 17:43h

RogerDez escreveu:

Faça um service do tipo:

# /etc/systemd/system/nomedoservico.service
[Unit]
Description=Copy and rename Firefox Bookmarks Exported HTML every day

[Service]
Type=oneshot
User=eumsm
ExecStart=/usr/bin/go run /use/caminho/completo/main.go


E se for para rodar par todos os usuários, acho que você pode rodar o service como root. Mas para isso, você deve arrumar o ambiente do Go para o root antes, e talvez seja melhor usar caminho completo até o arq do main.go.

Como root, depois de criar esse service em /etc/systemd/system, você deve habilitar o serviço:
# systemctl enable nomedoservico.service
# systemctl start nomedoservico.service


Se quiser, pode adicionar o parâmetro 'RemainAfterExit=yes' se ele for um daemon:
Type=oneshot: this is useful for scripts that do a single job and then exit. You may want to set RemainAfterExit=yes as well so that systemd still considers the service as active after the process has exited.


E também pode precisar adicionar
WantedBy=multi-user.target 

multi-user.target is basically the closest equivalent of classic SysVinit runlevel 3 that systemd has. When a systemd system boots up, systemd is trying to make the system state match the state specified by default.target - which is usually an alias for either graphical.target or multi-user.target.


faça uns testes..


Fiz o que foi instruido, veja se voce consegue descobrir o que deu errado (pesquisei mas n achei nada que resolvesse meu problema.

[root@archlinux goserver]# ls /goserver | grep .go
main.go

[root@archlinux goserver]# cat /etc/systemd/system/goserver.service
[Unit]
Description=My Go Web Page

[Service]
Type=oneshot
User=root
ExecStart=/usr/bin/go run /goserver/main.go
Restart=on-failure

[Install]
WantedBy=multi-user.target

[root@archlinux goserver]# systemctl enable goserver

[root@archlinux goserver]# systemctl start goserver
Job for goserver.service failed because the control process exited with error code.
See "systemctl status goserver.service" and "journalctl -xe" for details.
[root@archlinux goserver]# systemctl status goserver
&#9679; goserver.service - My Go Web Page
Loaded: loaded (/etc/systemd/system/goserver.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Wed 2020-03-18 17:39:59 -03; 5s ago
Process: 1202 ExecStart=/usr/bin/go run /goserver/main.go (code=exited, status=1/FAILURE)
Main PID: 1202 (code=exited, status=1/FAILURE)

mar 18 17:39:59 archlinux systemd[1]: goserver.service: Main process exited, code=exited, status=1/FAILURE
mar 18 17:39:59 archlinux systemd[1]: goserver.service: Failed with result 'exit-code'.
mar 18 17:39:59 archlinux systemd[1]: Failed to start My Go Web Page.
mar 18 17:39:59 archlinux systemd[1]: goserver.service: Scheduled restart job, restart counter is at 5.
mar 18 17:39:59 archlinux systemd[1]: Stopped My Go Web Page.
mar 18 17:39:59 archlinux systemd[1]: goserver.service: Start request repeated too quickly.
mar 18 17:39:59 archlinux systemd[1]: goserver.service: Failed with result 'exit-code'.
mar 18 17:39:59 archlinux systemd[1]: Failed to start My Go Web Page.





5. Re: Script de pagina WEB Vs Systemd

Rogerio
RogerDez

(usa Outra)

Enviado em 18/03/2020 - 19:21h

Tenho umas considerações, mas não sou expert não..

Faltou vc ver o log do 'journalctl -xe'.

Mas a princípio, se vc estiver logado como root, consegue executar esse programa de go na shell normalmente pelo tty?, por exemplo:
root@roothost # /usr/bin/go run /goserver/main.go 


Está parecendo que o usuário root não está rodando esse programa, não parece ser erro do systemd.
Se der algum erro quando executar o programa como root pela shell, tem que ver isso e pode ser que precise setar o GOPATH do root e deixar o pacote dentro dele, não tenho certeza se é necessário..

É necessário o servidor de X para o seu programa rodar? Se sim, então temos que ver como faz para ele rodar só depois que o xserver abrir..

Mais uma: tente usar 'Type=simple' ao invés de 'one-shot'

Mais uma: vc tentou realmente fazer um reboot para ver se ele incia no boot ou só tentou um 'systemctl start'???






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts