systemctl管理常驻服务
大家基本都与systemctl打过交道,它是现在linux主流的进程管理工具,只有在比较新的linux发行版中才会存在。
大家可以通过阮一峰的《Systemd入门教程》系统的了解一下这套工具的原理和用法。
我这里记录一下最基本的用法,可以实现利用systemd来监督一个服务端程序,一旦服务进程宕机就会自动重新拉起进程。
配置service
对于systemd来说,每个服务配置都是一个单元,叫做Unit。
常驻服务是一个类型为service的unit单元,我们编辑文件:/usr/lib/systemd/system/mysrv.service,后缀.service是一定要写的,这样systemd才知道我们配置的是一个service unit:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[Unit] # 服务描述 Description=my server # 要求必须执行网络 Requires=network-online.target # 在网络启动之后启动 After=network-online.target [Service] # 简单服务 Type=simple # 运行用户与用户组 User=work Group=work # 进程退出立即重启 Restart=always # 执行命令 ExecStart=/home/work/mysrv/bin/main # 进程工作目录 WorkingDirectory=/home/work/mysrv [Install] # 在系统启动后加载UNIT WantedBy=multi-user.target |
配置分3个段落:
- Unit:该unit依赖哪些其他的unit。
- Service:配置启动/停止服务的配置和命令。
- Install:该unit被哪些unit依赖,用途是借助系统默认加载的unit来拉起我们的unit。
target是若干unit的集合,上述用到的target都是systemd内置的。
上述配置描述了:我们的服务在正常开机后被加载,需要等待网络初始化成功,才能启动进程。
生效
执行命令:
1 |
systemctl enable mysrv.service |
执行上述命令,将把service配置文件链接到/etc/systemd/system/multi-user.target.wants/mysrv.service,从目录结构可以看出其表达的意思是multi-user.target依赖了哪些模块。
当开机后multi-user.target这个unit集合被systemd默认拉起,就会顺带拉起我们的mysrv.service。
查看
执行下述命令查看服务是否启动:
1 |
systemctl status mysrv.service |
启动服务
现在开机会自动启动我们的服务,也可以主动启动:
1 |
systemctl start mysrv.service |
停止服务
1 |
systemctl stop mysrv.service |
自动拉起
因为systemd监督了我们进程的死活,所以kill杀死进程后,服务进程会立即被重新拉起。
修改unit配置
如果需要修改unit配置,那么修改完成后需要让systemd重新加载配置,否则不会生效:
1 |
systemctl daemon-reload |
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~
