Primeiro, pare de usar seu "script de controle do servidor". Esse é o trabalho do systemd. O sistema init já rastreia os PIDs de serviço e fornece comandos start / stop.
Além disso, não use o sinalizador -
no ExecStart, a menos que você realmente saiba que é necessário. Diz ao systemd para ignorar falhas de inicialização, e com certeza você gostaria de saber quando o serviço falhou.
Por fim, tente evitar myapp &
nos scripts de inicialização. (O Init não precisa disso - serviços já executados em segundo plano por definição.) Se você precisar usá-lo, então Type=forking
seria mais correto.
(Definindo o tipo correto = informa ao systemd o que esperar, ou seja, quando considerar o servidor como "inicial" vs "iniciado" vs "finalizado". Tipo = simples significa que o processo inicial nunca ' fundos próprios; Tipo = forking é o oposto.)
Com isso, o seguinte deve funcionar melhor:
app.service
[Unit]
Description=java server
[Service]
Type=simple
User=deploy
ExecStart=/home/deploy/server/start.sh
SyslogIdentifier=my-app
Restart=always
RestartSec=100
[Install]
WantedBy=multi-user.target
start.sh
#!/bin/sh
cd "$(dirname "$0")"
exec java -mx500m -cp lib/* mylcass -port 8080 -arg val