本文以一个简单的java应用举例,介绍下如何将应用手动添加到systemctl中作为一个server启动。
目的:

  1. 将应用以service的形式注册进systemctl
  2. 使用普通用户启动该service
  3. 赋予普通用户启动/停止/重启该service的权限

前期准备

  • 建立deployer用户

    1
    sudo useradd deployer
  • 建立服务运行目录

    1
    2
    sudo mkdir -p /opt/java/
    sudo chown -R deployer:deployer /opt/java/
  • 将java代码拷贝如/opt/java/目录中,名为Main.jar

以service的形式注册应用

建立java运行脚本

添加/usr/local/bin/java_server.sh, 用于java应用的启动,停止和状态检查。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/bin/bash
# chkconfig: 2345 85 15
# description:auto_run
# 工作目录修改成自己的地址
# 注意!!! 并且该目录中只能存在一个jar包
APP_HOME=/opt/java/
JAR_HOME_TOW="`cd ${APP_HOME} && find -name '*.jar' `"
APP_NAME=${JAR_HOME_TOW:2}
cd $APP_HOME
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq "0" ]; then
echo "================================================="
echo "warn: $APP_NAME is already running. (pid=$pid)"
echo "================================================="
else
nohup java -jar $APP_NAME -Dfile.encoding=UTF-8 > /dev/null 2>&1 &
echo "${APP_NAME} start success"
fi
}
#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
echo "${APP_NAME} stop success"
else
echo "================================================="
echo "warn: $APP_NAME is not running"
echo "================================================="
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "================================================="
echo "warn: $APP_NAME is already running. (pid=$pid)"
echo "================================================="
else
echo "================================================="
echo "warn: $APP_NAME is not running"
echo "================================================="
fi
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
stop
echo "restart the application ..."
start
;;
*)
echo "================================================="
echo "Tips: start|stop|restart|status"
echo "================================================="
;;
esac

添加权限sudo chmod a+x /usr/local/bin/java_server.sh

添加service启动脚本

添加service文件 /usr/lib/systemd/system/java_server.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=java_server java service
After=syslog.target network.target
[Service]
User=deployer
Group=deployer
Type=forking
ExecStart=/usr/local/bin/java_server.sh start
ExecReload=/usr/local/bin/java_server.sh restart
ExecStop=/usr/local/bin/java_server.sh stop
PrivateTmp=false
[Install]
WantedBy=multi-user.target

此处,UserGroup都设置为deployer表示以deployer用户启动该service

一些systemctl的命令:
重载系统服务: sudo systemctl daemon-reload
设置开机启动sudo systemctl enable java_server.service
启动服务sudo systemctl start java_server.service
停止服务sudo systemctl stop java_server.service
重启服务sudo systemctl restart java_server.service
服务状态 sudo systemctl status java_server.service

赋予deployer用户停止和启动该service的权限

root用户执行如下命令,赋予deployer用户启动/停止java_server.service的权限。

1
2
3
4
5
6
7
8
START="/usr/bin/systemctl start java_server.service"
STOP="/usr/bin/systemctl stop java_server.service"
ENABLE="/usr/bin/systemctl enable java_server.service"
DISABLE="/usr/bin/systemctl disable java_server.service"
RESTART="/usr/bin/systemctl restart java_server.service"
echo "deployer ALL=(ALL) NOPASSWD: $START, $STOP, $ENABLE, $DISABLE, $RESTART" | tee /etc/sudoers.d/deployer-java_server
chmod 0440 /etc/sudoers.d/deployer-java_server

设置后,/etc/sudoers.d/deployer-java_server的内容如下:

1
deployer ALL=(ALL) NOPASSWD: /usr/bin/systemctl start java_server.service, /usr/bin/systemctl stop java_server.service, /usr/bin/systemctl enable java_server.service, /usr/bin/systemctl disable java_server.service, /usr/bin/systemctl restart java_server.service

如有授权命令修改,可以直接更新该文件。

配置sudoer文件后,deployer用户可使用如下命令启停java_server.service

  • 启动服务sudo systemctl start java_server.service
  • 停止服务sudo systemctl stop java_server.service
  • 设置开机启动sudo systemctl enable java_server.service
  • 服务状态 sudo systemctl disable java_server.service
  • 重启服务sudo systemctl restart java_server.service

Reference

留言