Systemd 及 Service 文件含义解析

joseph · · 479 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
Systemd 是 Linux下的一款系统和服务管理器,兼容 SysV 和 LSB 的启动脚本。Systemd 的特性有:支持并行化任务;同时采用socket式 与 D-Bus 总线式激活服务;按需启动守护进程(daemon);利用 Linux 的 cgroups 监视进程;支持快照和系统恢复;维护挂载点和自动挂载点;各服务间基于依赖关系进行精密控制。 其中的监视和控制功能的主要命令就是systemctl。 Systemd 有很多不同类型的使用单元,主要包括:系统服务(.service)、挂载点(.mount)、sockets(.sockets)、系统设备(.device)、交换分区(.swap)、文件路径(.path)、启动目标(.target)。一般我们常用的是其中的系统服务。 对于系统服务而言,比较重要的就是其中的 service 文件。我们先来看一个httpd.service文件,所在目录: /usr/lib/systemd/system/。其实单元文件可以从两个地方进行加载,优先级从低到高分别是: * /usr/lib/systemd/system/ :软件包安装的单元 * /etc/systemd/system/ :系统管理员安装的单元 Httpd.service 文件样例: ``` [Unit] Description=The Apache HTTP Server After=network.target remote-fs.targetnss-lookup.target Documentation=man:httpd(8) Documentation=man:apachectl(8) [Service] Type=notify EnvironmentFile=/etc/sysconfig/httpd ExecStart=/usr/sbin/httpd $OPTIONS-DFOREGROUND ExecReload=/usr/sbin/httpd $OPTIONS -kgraceful ExecStop=/bin/kill -WINCH ${MAINPID} # We want systemd to give httpd some timeto finish gracefully, but still want # it to kill httpd after TimeoutStopSec ifsomething went wrong during the # graceful stop. Normally, Systemd sendsSIGTERM signal right after the # ExecStop, which would kill httpd. We aresending useless SIGCONT here to give # httpd time to finish. KillSignal=SIGCONT PrivateTmp=true [Install] WantedBy=multi-user.target ``` 这个文件由三个部分组成:Unit、Service、Install。 [Unit] 主要是为了解决依赖关系。常见的添加 Requires、After,如果这个依赖是可选的,那么是 Wants、After。依赖关系通常被用在服务(service)而不是(target)上,所以上述的 httpd 所依赖的仅仅是一些 target,因而也就没有 Requires 和 Wants 出现。 [Service] 可选择几种不同的服务启动方式,启动方式通过Type参数进行设置。 * Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。 * Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。 * Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。 * Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。 * Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。 修改现存单元文件 要更改由软件包提供的单元文件,先创建名为 /etc/systemd/system/<单元名>.d/ 的目录(如/etc/systemd/system/httpd.service.d/),然后放入 *.conf文件,其中可以添加或重置参数。这里设置的参数优先级高于原来的单元文件。 例如,如果想添加一个额外的依赖,创建这么一个文件即可: /etc/systemd/system/<unit>.d/customdependency.conf ``` [Unit] Requires=<新依赖> After=<新依赖> ``` 然后运行以下命令使更改生效: ``` # systemctl daemon-reload # systemctl restart <单元> ``` 此外,把旧的单元文件从 /usr/lib/systemd/system/ 复制到/etc/systemd/system/,然后进行修改,也可以达到同样效果。 `systemctl enable <单元>` 在 /etc/systemd/system/ 目录中的单元文件的优先级总是高于 /usr/lib/systemd/system/ 目录中的同名单元文件。注意,当/usr/lib/ 中的单元文件因软件包升级变更时,/etc/ 中自定义的单元文件不会同步更新。此外,你还得执行 systemctl reenable <unit>,手动重新启用该单元。因此,建议使用前面一种利用 *.conf 的方法。 可以使用 journalctl 来查看 systemd 管理服务的启动日志: ``` journalctl -b -0 # 显示本次启动的信息 journalctl -b -1 # 显示上次启动的信息 ``` 参考阅读 ArchLinux 的 Systemd (简体中文) 文档:https://wiki.archlinux.org/index.php/Systemd_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

关注本站微信公众号(和以上内容无关)InfraPub ,扫码关注:InfraPub

479 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传