Systemd及service文件解析

Systemd及service文件解析

 

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/system/system/ :系统管理员安装的单元

 

[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 的方法。

 

可以使用jourlctl来进行systemd相关启动日志的查看。

 

journalctl -b -0  # 显示本次启动的信息

journalctl -b -1  # 显示上次启动的信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值