参考文章:

最近接触到了将自定义程序服务化的知识,服务化还是很有必要的,对程序的管理挺方便,所以做做笔记。

一、编辑 .service 文件

在 /usr/lib/systemd/system 目录下创建 elasticsearch.service 文件,文件内容如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Unit]
Description=Elasticsearch
Wants=network-online.target
After=network-online.target

[Service]
Type=forking # 程序后台运行
User=es # 服务启动的用户
Group=es # 服务启动的用户组
ExecStart=/opt/elasticsearch-5.6.16/bin/elasticsearch -d # 绝对路径来启动。
# 停止和重启命令缺省
LimitNOFILE=65536
LimitNPROC=4096
Restart=always
RestartSec=15s

[Install]
WantedBy=multi-user.target

注意:

  • ExecStart 为服务的具体运行命令,ExecReload 为重启命令,ExecStop 为停止命令。

  • [Service] 部分的启动、重启、停止命令全部要求使用绝对路径,使用相对路径则会报错!

  • 文件内容中不能存在注释。
  • 文件编辑完成之后,需要执行 systemctl daemon-reload 命令使文件生效。

必要时,需要添加 java 环境变量:

1
2
3
Environment=JAVA_HOME=/usr/java/jdk1.8.0_231
Environment=CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$JAVA_HOME/bin

二、实现 Elasticsearch 服务开机自启动:

1
2
3
4
5
[root@cdh-slave1 system]# systemctl enable elasticsearch
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
[root@cdh-slave1 system]# systemctl is-enabled elasticsearch.service
enabled
[root@cdh-slave1 system]#

三、服务操作命令(使用root用户操作):

1
systemctl start|status|stop elasticsearch

四、FAQ

1、通过 systemctl start xxx.service 启动服务后,过一会,大概一分钟左右,服务运行失败。

出现这种情况的原因是,ExecStart 进程没有挂在后台启动,所以过了一定时间后,systemctl 则判定进程超时失败又重启。

解决办法是:ExecStart=/bin/bash -c ‘nohup xxx命令 > /dev/null 2>&1 &’,让其后台启动即可。