Systemd State 'stop-sigterm' expirou

0

Eu tenho um servidor java simples + alguns scripts que eu quero rodar e manter vivo usando systemd (Ubuntu 16.04) Eu sou novo no systemd O serviço continua reiniciando com este log

Nov 16 10:20:12 systemd[1]: app.service: Unit entered failed state.
Nov 16 10:20:12 systemd[1]: app.service: Failed with result 'resources'.
Nov 16 10:29:25 systemd[1]: app.service: State 'stop-sigterm' timed out. Killing.
Nov 16 10:29:25  systemd[1]: app.service: Unit entered failed state.
Nov 16 10:29:25  systemd[1]: app.service: Failed with result 'timeout'.
Nov 16 10:31:06 systemd[1]: app.service: Service hold-off time over, scheduling restart.

Eu tenho 2 scripts simples para executar / controlar o servidor;

Aqui está minha app service defination app.service

   [Unit]
    Description=java server
    [Service]
    ExecStart=-/home/deploy/server/serverctl.sh start
    ExecStop=-/home/deploy/server/serverctl.sh stop
    ExecReload=-/home/deploy/server/serverctl.sh restart
    SyslogIdentifier=my-app
    User=deploy
    Restart=always
    RestartSec=100
    Type=simple
    [Install]
    WantedBy=multi-user.target

Meu start.sh

#!/bin/bash
cd "$(dirname "$0")"
java -mx500m -cp lib/* mylcass  -port 8080 -arg val > server.log 2>&1 & echo $!

ele executa o servidor e retorna o PID

Eu tenho um script de controle para iniciar / parar / status reiniciar o servidor, que funciona bem

#!/bin/bash

PID_FILE='/tmp/myserver.pid'

# ***********************************************
start() {
  PID='/path/to/server-start.sh'
}

case "$1" in
start)
    if [ -f $PID_FILE ]; then
        PID='cat $PID_FILE'
        if [ -z "'ps axf | grep -w ${PID} | grep -v grep'" ]; then
            start
        else
            exit 0
        fi
    else
        start
    fi

    if [ -z $PID ]; then
        exit 3
    else
        echo $PID > $PID_FILE
        exit 0
    fi
;;

status)
    echo "status"   
    if [ -f $PID_FILE ]; then
        PID='cat $PID_FILE'
        if [ -z "'ps axf | grep -w ${PID} | grep -v grep'" ]; then
            echo "Not running (process dead but pidfile exists)"
            exit 1
        else
            echo "Running [$PID]"
            exit 0
        fi
    else
        echo "Not running"
        exit 3
    fi
;;

stop)
    if [ -f $PID_FILE ]; then
        PID='cat $PID_FILE'
        if [ -z "'ps axf | grep -w ${PID} | grep -v grep'" ]; then
            exit 1
        else
            PID='cat $PID_FILE'
            kill -HUP $PID
            rm -f $PID_FILE
            exit 0
        fi
    else
        exit 3
    fi
;;

restart)
    $0 stop
    $0 start
;;

*)
    echo "Usage: $0 {status|start|stop|restart}"
    exit 1
esac

Alguma ideia? Como posso obter o systemd para garantir que o servidor esteja funcionando?

    
por macarthy 16.11.2016 / 12:03

1 resposta

1

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
    
por 16.11.2016 / 12:35