Я создал простую оболочку для 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: чтобы подтвердить, что нет stop
вариант в elasticsearch, вот результат 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
Итак, основываясь на информации, которую предоставил iwaseatenbyagrue, добавляем PIDFile
работал только когда я поменял Type
из simple
к forking
, так что теперь все работает как положено!
Вот как мой 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
В большинстве случаев (и в случае с вашим модульным файлом) 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