公众号:暮北林
Q Q 群 : 一起学前端
Systemd Service 学习和使用总结
什么是Systemd service
system就是系统,d的意思是daemon,systemd就是系统守护进程,守护系统级的服务.
我的个人理解就是管理系统服务的工具,可以对系统服务做一些操作,如:启动、结束、重启等,
这里我只列一些常用的属性,细节的地方可以查阅相关文档.
server的组成要素
[Unit]
# 描述信息和启动前的准备(启动的顺序 依赖的服务等)
[Service]
# 服务的实际操作,规定如何启动停止服务启动的PID等信息
[Install]
# 如何安装此服务,服务运行是并不会用到,只有在enable disable是才会使用
以上的三个要素Unit Service Install缺一不可,当然了也不能重复使用, 泪的教训啊???
[Unit]
[Unit]
Description="一个简短的说明"
# 对服务的一个简短说明 不需要过多赘述
Document=
# 一组用空格分隔的文档URI列表,一份服务的文档说明,可接受"http[s]://" "file:" "info:" "main:"五种URI类型
Requires=
# 此服务的依赖项,当启动此服务时这里列出的服务也必须启动和After Before有关联
# 建议使用Wants=替代
Wants=
# 此选项是Requires的弱化版,此服务启动时这里列出的服务尽可能的启动,即使启动失败也不会影响当前服务的启动
Before=
After=
# 上述两项指定了服务的启动顺序
# foo.service中设定了 Before=bar.service 启动时则foo.service先启动
# bar.service后启动, 服务的停止顺序则相反.
[Service]
[Service]
Type=
# 设置进程的启动类型,必须是simple、exec、forking、dbus、notify、idle之一
simple: ExecStart=进程就是该服务的主进程,systemd会认为创建了该服务的主进程服务进程后此服务启动完成
exec: exec与simple类似, 不同之处在于,在该服务的主服务进程执行完成后systemd才认为服务启动完成,其他待遇按必须一致阻塞到这个时间点才能继续启动
simple相当于fork()函数返回即成功
exec相当于 fork()与execve()都成功才算启动完成
forking ExecStart=进程启动时使用fork()系统调用,所有通信渠道建好启动也成功之后父进程退出子进程将作为主服务继续运行, 建议设置PidFile=一遍准确定位服务的主进程
PidFile=
# 该服务的PID文件路径一般位于(/run/目录下) 强烈建议在Type=forking是明确此选项
ExecStart=
# 启动服务需要执行的命令行,命令行必须以一个可执行文件开始,并附带器参数作为argv[1] argv[2]...传递给被执行的进程
TimeoutSec=
# 服务的启动的超时时间,单位为秒
User=
Group=
# 指定那个用户/用户组来启动此服务
Environment=
# 设置环境变量,服务ExecStart命令行可直接使用,或者指定EnvironmentFile
# 设置进程的环境变量, 接受一个空格分隔的 VAR=VALUE 列表。 可以多次使用此选项以增加新的变量或者修改已有的变量(同一个变量以最后一次设置为准)。 设为空表示清空先前所有已设置的变量。
[Install]
Alias=
# 启用时的别名
WantedBy=
RequiredBy=
# 接受一个空格分隔的单元列表, enable后会在每个单元列表.wants/ 或.requires/目录创建一个软连接指向该单元文件.
systcmctl操作service
启用service
# systemctl enable servicename.service
# enable后将会在 /etc/systemd/syetem/目录下创建一个软链指向jenkins.service
systemctl enable jenkins.service
Created symlink /etc/systemd/system/multi-user.target.wants/jenkins.service → /etc/systemd/system/jenkins.service
禁用service
systemctl disabel jenkins.service
#禁用就是撤销ln软链的过程
重新加载service
# 重新加载所有修改过的service
systemctl daemon-reload
# 重新加载指定service
systemctl reload jenkins.service
启动服务
systemctl start jenkins.service
停止服务
systemctl stop jenkins.service
查看服务状态
systemctl status jenkins.service
我的使用及问题
工作中使用systemctl的地方还是挺多的,比如内网搭建的NPM库、Jenkins、爬虫脚本的开机自启等
npm库和Jenkins自启是老是Timeout 查阅文档后设置TimeoutSec=0才好使
Jenkins的构建目录在自启时老是在root账户下, 最后指定User=wangfpp才在当前用户的家目录下
还有重复的[Unit] 缺少[Install]等的错误属于service的编写错误
参考文档
systemd.service中文翻译http://www.jinbuguo.com/systemd/systemd.service.html
systemd.service英文文档
https://www.freedesktop.org/software/systemd/man/systemd.service.html
阮一峰教程
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html
最简明扼要的 Systemd 教程
https://linux.cn/article-6888-1.html