文章详情页 您现在的位置是:网站首页>文章详情
编写systemd的service
Jeyrce.Lu 发表于:2021年3月5日 15:59 分类:【服务器】 3355次阅读
什么是sevice
Systemd 服务是一种以 .service 结尾的单元(unit)配置文件,用于控制由Systemd 控制或监视的进程。简单说,用于后台以守护精灵(daemon)的形式运行程序。
Systemd 广泛应用于新版本的RHEL、SUSE Linux Enterprise、CentOS、Fedora和openSUSE中,用于替代旧有的服务管理器service。
基本操作命令:
systemctl command xxx.service # 其中command可以是start、stop、restart、enable等,比如: systemctl start httpd.service #启动Apache服务 systemctl stop httpd.service #停止Apache服务 systemctl restart httpd.service #停止Apache服务 systemctl enable mariadb.service #将MariaDB服务设为开机启动
为什么要用service
我们在进行操作系统采用传统的服务部署(指的是和docker、k8s容器这样的相比直接在操作系统运行的进程)时会用到各种进程托管方式,例如我们一直使用supervisord、nohup、screen等让程序一直在后台处于daemon的方式运行,所有的方式可分为系统自带工具和第三方工具。第三方工具往往功能强大操作简单,而系统自带工具相对来说功能可能偏少一些。但是第三方工具存在的缺点是需要安装解决依赖问题,在我们多数要求严格的客户机房内网环境中,解决依赖是一件非常头痛的事情。随着centos、redhat7.x版本系统以后,systemd已经成为一种功能强大操作简单系统默认的进程管理工具,非常适合用于在操作系统中部署服务。
service编写示例
# Created by Jeyrce.Lu 2021-02-23 16:39 PM. # https://www.freedesktop.org/software/systemd/man/systemd.unit.html # 自定义控制单元: 描述单元元数据、配置、和其他单元的关系 [Unit] # 服务单元描述,可根据需要任意填写 Description=Prometheus Server # 文档地址 Documentation=https://prometheus.io/docs/introduction/overview/ # 本单元启动后,尝试拉起want单元,拉起是否成功对自身无影响 Wants=network-online.target # 本单元想启动必须依赖于require的单元全部启动[一般不使用] #Requires= # 绑定单元,如果bindsto单元退出则本单元也退出 #BindsTo= # 本单元启动失败,则启动onfailure定义的单元 #OnFailure= # Before/After 指定启动单元的顺序[不涉及单元依赖] After=network.target # 排除单元,conflict单元不能和本单元同时运行 #Conflicts= # 运行条件ConditionXXX,本单元运行必须满足的条件 #ConditionUser= # 运行条件AssertXXX,本单元运行必须满足的条件,否则报错 #AssertCPUs= # Service配置: 只有Service类型的单元才有此区块 [Service] # 服务类型,可选:simple、forking、oneshot、dbus、notify、idle、 # simple: 默认值,启动程序即为程序主体 # forking: 标准Unix Daemon模式,调用系统fork函数,留下守护精灵子进程 # oneshot: 一次性执行任务可以搭配RemainAfterExit=yes使用[进程不存在也认为执行成功了]。此类型支持多条命令(;分割\换行)执行 # dbus: 运行需要获取一块DBus空间,需要搭配BusNmae=一起使用,成功获取DBus空间后程序启动 # notify: 本单元启动完毕通知systemd,之后systemd启动其他单元 # idle: 等待systemd在空闲时再启动本单元,优先启动其他单元 Type=simple # 单元运行的用户 User=sendoh # 单元运行的属组 Group=sendoh # 启动本单元之前执行的命令 #ExecStartPre= # systemctl start xxx 的时候使用的命令 ExecStart=/home/sendoh/qdm/holmes/holmes/prometheus/prometheus \ --config.file=/home/sendoh/qdm/holmes/holmes/prometheus/prometheus.yml \ --web.listen-address=0.0.0.0:10011 \ --web.read-timeout=5m \ --web.max-connections=512 \ --web.external-url=http://0.0.0.0:10011/prometheus \ --web.enable-lifecycle \ --web.enable-admin-api \ --web.page-title="Holmes" \ --web.cors.origin=".*" \ --storage.tsdb.retention.time=90d \ --storage.tsdb.path=/home/sendoh/qdm/holmes/holmes/prometheus/data/ \ --rules.alert.for-outage-tolerance=1h \ --rules.alert.resend-delay=1m \ --alertmanager.notification-queue-capacity=1000 \ --alertmanager.timeout=10s \ --query.lookback-delta=31m \ --query.timeout=2m \ --query.max-concurrency=20 \ --query.max-samples=10000000 \ --log.level=debug \ --log.format=logfmt # 启动本单元之后执行的命令 ExecStartPost=/usr/bin/echo "Prometheus start succeed." # systemctl stop xxx 的时候使用的命令 #ExecStop=/home/sendoh/holmes/phoenix --stop # 停止本单元后执行的命令 ExecStopPost=/usr/bin/echo "Prometheus stopped." # systemctl restart xxx 的时候使用的命令 ExecReload=/usr/bin/kill -HUP $(/usr/bin/pgrep prometheus) # 重启策略: no、always、on-success、on-failure、on-abnormal、on-abort、on-watchdog Restart=always # 重启服务需要等待的时间 RestartSec=5 # 指定环境变量: 可以等号后增加-抑制错误 #Environment= # 环境变量文件 #EnvironmentFile= # 安装服务: 定义单元如何启动、是否开机自启 [Install] # 服务被哪些target装载,当unit被enable时符号连接放入/etc/systemd/system/target名.wants/ WantedBy=multi-user.target # 服务被哪些target需要,当unit被enable时符号连接放入/etc/systemd/system/target名.required/ #RequiredBy= # 本单元可以用于启动的别名 Alias=Prometheus # 服务激活关联,本单元被enable时会被同时激活的其他unit #Also=
启用service
将上述phoenix.service文件放入 /usr/lib/systemd/system/ 下执行 systemctl daemon-reload之后就可以对service进行start stop 等操作了。
版权声明 本文属于本站 原创作品,文章版权归本站及作者所有,请尊重作者的创作成果,转载、引用自觉附上本文永久地址: http://blog.lujianxin.com/x/art/dovhvqvv29g7
上一篇:客户现场问题解决流程
下一篇:git仓库的大文件处理
文章评论区
作者名片
- 作者昵称:Jeyrce.Lu
- 原创文章:61篇
- 转载文章:3篇
- 加入本站:2058天
作者其他文章
站长推荐
友情链接
站点信息
- 运行天数:2060天
- 累计访问:164169人次
- 今日访问:0人次
- 原创文章:69篇
- 转载文章:4篇
- 微信公众号:第一时间获取更新信息