Systemd не запускает приложение из оболочки

Я создал простую оболочку для Elasticsearch и служебный файл systemd, и по какой-то причине я не могу запустить Elasticsearch из systemd, однако я могу сделать это из самой оболочки.

Вот моя (очень простая) оболочка:

#!/bin/sh
SERVICE_NAME=elasticsearch
PATH_TO_APP="/opt/$SERVICE_NAME/bin/$SERVICE_NAME"
PID_PATH_NAME="/var/run/$SERVICE_NAME/$SERVICE_NAME.pid"
SCRIPTNAME=elasticsearch-wrapper.sh
ES_USER=$SERVICE_NAME
ES_GROUP=$SERVICE_NAME
SUDO="sudo -u $SERVICE_NAME"

case $1 in
    start)
        echo "Starting $SERVICE_NAME ..."
        if [ ! -f $PID_PATH_NAME ]; then
        mkdir $(dirname $PID_PATH_NAME) > /dev/null 2>&1 || true
            chown $ES_USER $(dirname $PID_PATH_NAME)
            $SUDO $PATH_TO_APP -d -p $PID_PATH_NAME
        echo "Return code: $?"
            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is already running ..."
        fi
    ;;
    stop)
        if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME);
            echo "$SERVICE_NAME stopping ..."
            kill -15 $PID;
            echo "$SERVICE_NAME stopped ..."
            rm $PID_PATH_NAME
        else
            echo "$SERVICE_NAME is not running ..."
        fi
    ;;
    restart)
        if [ -f $PID_PATH_NAME ]; then
            PID=$(cat $PID_PATH_NAME);
            echo "$SERVICE_NAME stopping ...";
            kill -15 $PID;
        sleep 1;
            echo "$SERVICE_NAME stopped ...";
            rm -rf $PID_PATH_NAME
            echo "$SERVICE_NAME starting ..."
            mkdir $(dirname $PID_PATH_NAME) > /dev/null 2>&1 || true
            chown $ES_USER $(dirname $PID_PATH_NAME)
            $SUDO $PATH_TO_APP -d -p $PID_PATH_NAME
            echo "$SERVICE_NAME started ..."
        else
            echo "$SERVICE_NAME is not running ..."
        fi
    ;;
  *)
    echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
    exit 3
    ;;
esac

А вот мой файл elasticsearch.service :

[Unit]
Description=ElasticSearch Server
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
Type=simple
#ExecStart=/opt/elasticsearch/bin/elasticsearch -d
ExecStart=/opt/elasticsearch/bin/elasticsearch-wrapper.sh start
ExecStop=/opt/elasticsearch/bin/elasticsearch-wrapper.sh stop
ExecReload=/opt/elasticsearch/bin/elasticsearch-wrapper.sh restart
#ExecStop=/opt/elasticsearch/bin/elasticsearch-stop.sh
LimitNOFILE=65536
LimitMEMLOCK=infinity
User=root
StandardOutput=journal+console

Это результат systemd status elasticsearch после попытки его запустить:

● elasticsearch.service - ElasticSearch Server
   Loaded: loaded (/etc/systemd/system/elasticsearch.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

Mar 23 17:38:30 ip-10-96-13-64 systemd[1]: Started ElasticSearch Server.
Mar 23 17:38:30 ip-10-96-13-64 elasticsearch-wrapper.sh[2866]: Starting elasticsearch ...
Mar 23 17:38:30 ip-10-96-13-64 sudo[2872]:     root : unable to resolve host ip-10-96-13-64
Mar 23 17:38:30 ip-10-96-13-64 elasticsearch-wrapper.sh[2866]: sudo: unable to resolve host ip-10-96-13-64
Mar 23 17:38:30 ip-10-96-13-64 sudo[2872]:     root : TTY=unknown ; PWD=/ ; USER=elasticsearch ; COMMAND=/opt/elasticsearch/bin/elasticsearch -d -p /var/run/elasticsearch/elasticsearch.pid
Mar 23 17:38:30 ip-10-96-13-64 sudo[2872]: pam_unix(sudo:session): session opened for user elasticsearch by (uid=0)
Mar 23 17:38:30 ip-10-96-13-64 sudo[2872]: pam_unix(sudo:session): session closed for user elasticsearch
Mar 23 17:38:30 ip-10-96-13-64 elasticsearch-wrapper.sh[2866]: Return code: 0
Mar 23 17:38:30 ip-10-96-13-64 elasticsearch-wrapper.sh[2866]: elasticsearch started ...
Mar 23 17:38:30 ip-10-96-13-64 elasticsearch-wrapper.sh[2895]: elasticsearch is not running ...

Я поставил отладочную инструкцию, которая возвращает «код возврата» при запуске elasticsearch, и, как вы можете видеть в systemctl status , он возвращает 0 . Я даже просмотрел журналы elasticsearch сразу после выполнения systemctl start elasticsearch и ничего, как буквально ничего в журналах; как будто он даже не запускал elasticsearch.

Я не уверен, почему это происходит, поэтому в крайнем случае я размещаю его здесь, чтобы посмотреть, может ли кто-нибудь помочь мне и указать, что здесь происходит. Повторюсь, запуск / остановка / перезапуск elasticsearch из оболочки напрямую работает нормально без проблем, но с systemd он не работает.

РЕДАКТИРОВАТЬ: Причина, по которой я использую оболочку, потому что, согласно их документация , вы должны выполнить kill процесс. Кроме того, я бы предпочел также иметь опцию ExecReload .

EDIT2: Чтобы подтвердить, что в elasticsearch нет опции stop , вот результат elasticsearch --help

USER# ./elasticsearch --help
starts elasticsearch

Option                Description                                              
------                -----------                                              
-E <KeyValuePair>     Configure a setting                                      
-V, --version         Prints elasticsearch version information and exits       
-d, --daemonize       Starts Elasticsearch in the background                   
-h, --help            show help                                                
-p, --pidfile <Path>  Creates a pid file in the specified path on start        
-q, --quiet           Turns off standard ouput/error streams logging in console
-s, --silent          show minimal output                                      
-v, --verbose         show verbose output
0
задан 23 March 2017 в 20:14
2 ответа

Итак, основываясь на информации, предоставленной iwaseatenbyagrue, добавление PIDFile сработало только тогда, когда я изменил тип с простой на разветвление , так что теперь он работает должным образом!

Вот как теперь выглядит мой elasticsearch.service :

[Unit]
Description=ElasticSearch Server
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
Type=forking
#ExecStart=/opt/elasticsearch/bin/elasticsearch -d
ExecStart=/opt/elasticsearch/bin/elasticsearch-wrapper.sh start
ExecStop=/opt/elasticsearch/bin/elasticsearch-wrapper.sh stop
ExecReload=/opt/elasticsearch/bin/elasticsearch-wrapper.sh restart
#ExecStop=/opt/elasticsearch/bin/elasticsearch-stop.sh
PIDFile=/var/run/elasticsearch/elasticsearch.pid
LimitNOFILE=65536
LimitMEMLOCK=infinity
User=root
StandardOutput=journal+console
0
ответ дан 5 December 2019 в 18:45

В большинстве случаев (и в случае вашего файла модуля) systemd ожидает, что будет отслеживать PID программы напрямую.

Добавление оболочки означает, что systemd видит PID оболочки, но не может отслеживать PID ES.

Вы можете увидеть это в своем выводе:

Mar 23 17:38:30 ip-10-96-13-64 elasticsearch-wrapper.sh[2866]: Return code: 0

Ваша оболочка завершается без ошибок, поэтому systemd заключает, что ничего не запущено.

Я настоятельно рекомендую вам переместить все необходимые функции настройки для использования systemd ExecStartPre и запускать ES непосредственно из systemd.

Если вам абсолютно необходимо использовать оболочку, вы должны убедиться, что ES записывает PID-файл и предоставляет systemd путь к нему, используя PIDFile .

Однако я думаю, вам лучше иметь что-то вроде:

[Unit]
Description=ElasticSearch Server
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
Type=simple
User=elasticsearch
Group=elasticsearch
ExecStartPre=-mkdir /opt/elasticsearch/data
ExecStart=/opt/elasticsearch/bin/elasticsearch OPTIONS
ExecStop=/opt/elasticsearch/bin/elasticsearch stop
LimitNOFILE=65536
LimitMEMLOCK=infinity
StandardOutput=journal
-1
ответ дан 5 December 2019 в 18:45

Теги

Похожие вопросы