У меня есть простой сервер Java + несколько сценариев, которые я хочу запустить и поддерживать с помощью systemd (Ubuntu 16.04). Я новичок в systemd. Служба перезапускается с этим журналом.

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.

У меня есть 2 простых скрипта bash для запуска / управления сервером;

Вот мой сервис определения 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

Мой старт.ш

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

он запускает сервер и возвращает PID

У меня есть сценарий управления для запуска / остановки / состояния перезагрузки сервера, который работает нормально

#!/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

Есть идеи? Как получить systemd, чтобы убедиться, что сервер запущен и работает?

1 ответ1

1

Во-первых, пожалуйста, прекратите использовать ваш "скрипт управления сервером". Это работа systemd. Система init уже отслеживает PID службы и предоставляет команды пуска / останова.

Кроме того, не используйте флаг - в ExecStart, если вы действительно не знаете, что это необходимо. Он сообщает systemd игнорировать сбои при запуске, и вы наверняка захотите узнать, когда произошел сбой службы.

Наконец, попытайтесь избежать myapp & в сценариях запуска. (Инициализация не нужна - службы по определению уже работают в фоновом режиме.) Если вы должны использовать его, тогда Type=forking будет более правильным.

(Установка правильного Type = сообщает systemd, чего ожидать, т.е. когда рассматривать сервер как "стартовый" против "запущенный" против "законченный". Тип = простой означает, что начальный процесс никогда не "сам по себе"; Тип = разветвление это наоборот.)

При этом следующее должно работать лучше:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .