创建 systemd服务
通常在 unix系统上部署一个程序后,希望有便捷的启动,停止,重启,状态查询等功能。使用系统自带的 systemd服务便是解决方案之一。
大概步骤如下:
- 创建一个系统服务描述文件,eg:
/etc/systemd/system/app.service
- 启动服务,
sudo systemctl start app
- 设置开机启动,
sudo systemctl enable app
-> 编写服务描述文件
有点类似yaml的格式,示例如下:
[Unit]
Description=Gunicorn instance to serve flask
After=network.target
[Service]
Type=notify
User=alex
Group=nginx
WorkingDirectory=/data/home/workspace/myproject
Environment=FLASK_ENV=production REDIS_PASSWORD=xxx MYSQL_PASSWORD=xxxx
ExecStart=/data/home/workspace/myproject/flask/bin/gunicorn --workers 2 --bind unix:app.sock -m 007 app:app
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=mixed
TimeoutStopSec=5
PrivateTmp=true
[Install]
WantedBy=multi-user.targe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- 大小写敏感
- 基本格式为
key=value
, 等号前后的空格会被忽略 - 注释以
#
或者;
起始 - 可使用
\
连接多行为一行 Unit
区块描述一些元信息以及依赖,示例中给出了服务描述和网络依赖,完整的字段描述见 systemd.unit (opens new window)Service
区块用来描述 Service的配置Install
区块是给systemctl enable|disable
用的,用来定义如何启动,以及是否开机启动
可以看出,重点在 Service部分, 完整的字段描述见 systemd.service (opens new window)
Type
:定义启动时的进程行为。它有以下几种值。Type=simple
:默认值,执行ExecStart指定的命令,启动主进程Type=forking
:以 fork 方式从父进程创建子进程,创建后父进程会立即退出Type=oneshot
:一次性进程,Systemd 会等当前服务退出,再继续往下执行Type=dbus
:当前服务通过D-Bus启动Type=notify
:当前服务启动完毕,会通知Systemd,再继续往下执行Type=idle
:若有其他任务执行完毕,当前服务才会运行ExecStart
:启动当前服务的命令ExecStartPre
:启动当前服务之前执行的命令ExecStartPost
:启动当前服务之后执行的命令ExecReload
:重启当前服务时执行的命令ExecStop
:停止当前服务时执行的命令ExecStopPost
:停止当其服务之后执行的命令RestartSec
:自动重启当前服务间隔的秒数Restart
:定义何种情况 Systemd 会自动重启当前服务, 默认值是no
, 不会自动重启- 可能的值包括
always
(总是重启)、on-success
、on-failure
、on-abnormal
、on-abort
、on-watchdog
- 可能的值包括
TimeoutSec
:定义 Systemd 停止当前服务之前等待的秒数Environment
:指定环境变量- 可以定义多个环境变量值。eg:
Environment=FLASK_ENV=production REDIS_PASSWORD=xxx MYSQL_PASSWORD=xxxx
- 可以定义多个环境变量值。eg:
EnvironmentFile
: 从单独的文件加载环境变量
-> 常用服务命令
sudo systemctl systemd-analyze verify app.service
, 检查服务文件sudo systemctl start app
, 启动服务sudo systemctl stop app
, 停止服务sudo systemctl status app
, 查看服务状态sudo systemctl reload app
, 重新加载一个服务的配置文件sudo systemctl restart app
, 先 stop再重新 start 服务sudo systemctl kill app
, 杀死一个服务的所有子进程sudo systemctl show app
, 显示服务的所有底层参数sudo systemctl daemon-reload
service文件有改动时,需要执行该命令重新加载sudo systemctl enable app
, 设置开机启动sudo systemctl disable app
, 禁用开机启动
-> 参考
编辑此页 (opens new window)
更新于: 2019-07-31 10:15