O serviço Systemd não está funcionando

1

Acabei de mudar para o servidor 16.04 do servidor 14.04. Com o Upstart eu costumava iniciar meu servidor com um arquivo que eu tinha em /etc/rcS.d chamado M95. O M95 foi chamado por /etc/rc.local. Agora com o systemd eu escrevi um arquivo em / etc / systemd / system chamado my.service. Parece assim:

[Unit]
Description=MyService

[Service]
WorkingDirectory=/etc
ExecStart=/bin/sh rc.local

[Install]
WantedBy=multi-user.target

Quando eu digito "/ bin / sh rc.local" na linha de comando, meu servidor é iniciado. Quando tento iniciar o serviço fazendo "systemctl start my.service" nada acontece.

As linhas relevantes no journalctl -b são:

Started MyService.
eth0 ...(basically the info I see from ifconfig)
root : TTY=unknown ; PWD=/etc ; USER=root ; COMMAND=/etc/rcS.d/M95
pam_unix(sudo:session): session opened for user root by (uid=0)
$File not found:: /new/den-routes
udhcpd already running
pam_unix(sudo:session): session closed for user root
/bin/rm: cannot remove '/var/log/rewriting-net-rules': No such file or directory.

No rc.local, parece:

#!/bin/sh -e
...
sudo /etc/rcS.d/M95
/bin/rm /var/log/rewriting-net-rules

exit 0

No M95, ele inicia o udhcpd (que é onde a mensagem "udhcpd já está em execução") e no final inicia o servidor dizendo:

cd /new
/bin/sh StartServer&

Parece que ele chega ao M95 porque as mensagens estão sendo registradas a partir dele, mas o servidor não inicia. Quando executo esses arquivos na linha de comando, funciona, mas como o serviço não funciona. Eu não estou muito familiarizado com o systemd, então não tenho idéia se estou fazendo isso corretamente. Por uma semana eu tenho lido exemplos e tutoriais para isso, mas ainda não tenho certeza de como isso funciona e como o arquivo de serviço deve ser escrito.

Edit: Aqui está o meu arquivo StartServer:

#!/bin/bash
nohup /jre/jdk1.8.0_101/jre/bin/myserver -Xrs -Xmx1000m -jar /new/MyServer.jar nowd &

Ele funciona muito bem quando eu inicio a partir da linha de comando. Ele é executado quando eu chamo de my.service. Eu coloquei alguns echos para ver que ele passa pelo arquivo inteiro, mas myserver e MyServer.jar não iniciam por algum motivo.

    
por khm 29.09.2016 / 18:08

2 respostas

0

Descobriu-se que o problema estava em um trecho de código em rc.local. Uma linha que alguém colocou tentando remover um arquivo produziria um erro e faria com que o programa fosse encerrado se o arquivo não existisse. Não tenho certeza por que ele não produziu esse erro quando o executei na linha de comando, mas quando executado usando um serviço, ele parou de funcionar.

Eu consertei adicionando uma instrução if para verificar se esse arquivo existe antes de tentar removê-lo.

    
por khm 03.01.2017 / 16:44
4

Meu Deus, há muitas coisas erradas aqui.

  • Você não está executando seu serviço diretamente. mas, em vez disso, sua unidade de serviço está executando um shell que interpreta rc.local no diretório de trabalho /etc . Isto apesar do fato de que o systemd tem uma unidade de serviço pré-fornecida para executar /etc/rc.local se realmente quiser. ( rc.local é um mecanismo que foi substituído três vezes no Ubuntu, primeiro por van Smoorenburg rc , depois por upstart, depois por systemd.)
  • Mas /etc/rc.local também não está executando seu serviço. Em vez disso, ele está chamando sudo , apesar do fato de já estar
  • Isso, por sua vez, executa um (segundo) script de /etc/rcS.d , apesar do fato de que o diretório é um farm de link simbólico que não deve conter arquivos de script rc reais.
  • Esse script é executado à mão de que o systemd já está claramente sendo executado como serviços reais.
  • Ele acha que o diretório de trabalho deve ser /new não /etc .
  • Mas mesmo isso não é seu serviço. Em vez disso, ele está bifurcando um shell para interpretar um terceiro script chamado StartServer .
  • Não está usando exec para se sobrepor.
  • Ele está usando & para executar esse shell de forma assíncrona.
  • Esse quarto script é forking e executar um programa em Java.
  • Ele também não está usando exec para se sobrepor.
  • E a cereja no topo do bolo é que é também usando & para executar esse programa Java de forma assíncrona.

Nada disso é necessário.

E você aparece sem razão aparente para tê-lo colocado no meio de um mecanismo para redefinir endereços MAC em máquinas virtuais clonadas.

[Unit]
Documentation=https://askubuntu.com/a/831314/43344
After=udhcpd.service

[Service]
WorkingDirectory=/new
ExecStart=/jre/jdk1.8.0_101/jre/bin/myserver -Xrs -Xmx1000m -jar /new/MyServer.jar nowd

[Install]
WantedBy=multi-user.target

Também há claramente uma adição After= necessária para o que está escrevendo o arquivo den-routes que seu daemon está esperando; você, no entanto, não fornece nenhuma informação para determinar o que é isso.

Leitura adicional

por JdeBP 29.09.2016 / 21:00