其中的监视和控制功能的主要命令就是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)
153 次点击
加入收藏