制作systemd服务

Centos7开始,系统服务管理方式发生了很大变化。服务由systemd管理。下面具体介绍下服务的制作过程.本网由编制整理加工而成。更多相关可以参见易点知识库地址为:https://sun.book77.com. systemed管理笔者最深的是是服务异常处理,可以秒级把异常服务重新拉起。下面具体说明过程:
第一步分: 制作systemd服务

下面以nginx服务测试为例说明:
1.创建/usr/local/nginx/ngx.txt文件
cat ngx.txt
aaa=1111111
bbb=2222222

2.在/usr/lib/systemd/system目录下新建服务,nginx.service
cat nginx.service

[Unit]
Description=The Nginx Server Deamon
Documentation=http://localhost/nginx.txt
After=network.target remote-fs.target nss-lookup.target #在服务启动之前要启动的服务

[Service]
Type=forking #后台启动
#BusName= #设置与此服务通讯所使用的D-Bus名称,如果Type=dbus,则必须设置此项
User=root
Group=root
#Nice= #设置进程nice值
#Environment= #环境变量,key=value形式,例当启动ES时,可以在这里指定java环境变量
EnvironmentFile=/usr/local/nginx/ngx.txt #变量文件,可以通过$key引用
PIDFile=/usr/local/nginx/logs/nginx.pid #设置PIDFile
TimeoutStartSec=30s #启动服务超时时间
RestartSec=100ms #重启前停止时间
TimeoutStopSec=0 #服务停止超时时间,文档:值infinity表示永不超时,测试报错
ExecStartPre=/usr/local/nginx/sbin/nginx -t #启动前执行的脚本
ExecStartPost=/bin/echo $bbb #服务启动执行的脚本
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf #可以编写脚本文件,文件中exit 0报错,且ExecStartPre=/usr/local/nginx/sbin/nginx -t报错
ExecReload=/usr/bin/kill -s HUP $MAINPID
ExecStop=/usr/bin/kill -s QUIT $MAINPID
ExecStopPost=/bin/echo $aaa #服务停止后执行的脚本,这里的输出可以通过systemctl status nginx查看
Restart=always #不管什么退出原因,都会自动重启除了systemctl stop
KillMode=process #如何停止服务
PrivateTmp=true

[Install]
WantedBy=multi-user.target #表示多用户命令行状态;graphical.target为图形界面
#Alias= #当前Unit可用于启动的别名

3.加载systemd文件
systemctl daemon-reload

4.开启开机启动
systemctl enable nginx.service

第二部分:参数说明

[Service]部分:
Type:
simple: 默认值,执行ExecStart指定的命令,启动主进程
forking: 以fork方式从父进程创建子进程,创建后父进程会立即退出
oneshot: 一次性进程,Systemd 会等当前服务退出,再继续往下执行
dbus: 当前服务通过D-Bus启动
notify: 当前服务启动完毕,会通知Systemd,再继续往下执行
idle: 若有其他任务执行完毕,当前服务才会运行
Restart:
no: 默认值,表示任何时候都不会被重启
no-success: 表示仅在服务进程正常退出时重启(退出状态码为0)
on-failure: 表示仅在服务进程异常退出时重启(退出状态码非0)
always: 不管什么退出原因,都会自动重启除了systemctl stop
on-abort: 只有在收到没有捕捉到的信号终止时,才会重启
on-watchdog 超时退出,才会重启
KillMode:
control-group(默认值): 当前控制组里面的所有子进程,都会被杀掉
process: 只杀主进程
mixed: 主进程将收到 SIGTERM 信号,子进程收到SIGKILL信号
none: 没有进程会被杀掉,只是执行服务的stop命令

[Unit]部分:
Before: 如果该字段指定的Unit也要启动,那么必须在当前Unit之后启动,不涉及依赖关系
Requires: 当前Unit依赖的其他Unit,如果它们没有运行,当前Unit会启动失败
Wants: 与当前Unit配合的其他Unit,如果它们没有运行,当前Unit不会启动失败
BindsTo: 与Requires类似,它指定的Unit如果退出,会导致当前Unit停止运行
Conflicts: 这里指定的Unit不能与当前Unit同时运行
Condition: 当前Unit运行必须满足的条件,否则不会运行
Assert: 当前Unit运行必须满足的条件,否则会报启动失败

第三部分:systemctl服务命令

systemctl daemon-reload 服务文件变动重新加载
systemctl start nginx 开启服务
systemctl stop nginx 停止服务
systemctl reload nginx.service 重新加载服务,服务运行时才能执行
systemctl restart nginx.service 重启服务
systemctl status nginx.service 查看服务状态
systemctl enable nginx.service 服务到开机自启
systemctl disable nginx.service 取消开机自启

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值