linux systemd service 服务文件简介

文章详细介绍了systemd系统中创建和服务定义.service文件的过程,包括服务的启动流程、配置参数如Type、Environment、PIDFile等,以及systemctl命令的使用,如启动、停止、重启服务和管理开机启动等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

实现流程

创建.service文件

概念

命令

控制单元(Unit)

服务定义(service)

Type

Environment

EnvironmentFile

PIDFile

ExecStart

ExecStop

ExecStartPre

ExecStartPost

ExecStopPost

KillMode

Restart

SuccessExitStatus

RestartSec

WorkingDirectory

User

PrivateTmp

安装部分(Install)

WantedBy

RequiredBy

Alias

Also

Target

概念

命令


实现流程

创建.service文件

创建ping@.service文件,内容可以如下:

[Unit]
Description=ping daemon
After=network.target 

[Service]
Restart=on-failure
ExecStart=/usr/bin/ping 127.0.0.%d
ExecReload=/bin/kill -s -HUP $MAINPID               
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
KillMode=none                  
LimitCORE=infinity

[Install]
WantedBy=multi-user.target 

文件迁移

将.service文件拷贝至/usr/lib/systemd/system/下

cp ping@.service /usr/lib/systemd/system/

加载配置

systemctl daemon-reload

调用服务

# 启动服务
systemctl start ping@1

# 查看服务进程
ps –aux | grep ping

systemctl

概念

systemctl是一个systemd工具,负责控制systemd系统和管理系统服务。

命令

#当新增或修改service单元文件时,需要系统重新加载所有修改过的配置文件
systemctl daemon-reload

#设置为开机自启动
systemctl enable RegisterCenter

#关掉开机启用
systemctl disable RegisterCenter

#启动服务
systemctl start RegisterCenter

#重启服务,相当于先stop,再start
systemctl restart RegisterCenter

#关闭服务,关闭服务后,进程会全部被kill掉
systemctl stop RegisterCenter

#查看服务的状态
systemctl status RegisterCenter

#查看服务是否开机启动
systemctl is-enabled RegisterCenter

#查看已启动的服务列表
systemctl list-unit-files|grep enabled
#
显示所有已启动的服务
systemctl list-units --type=service

#查看启动失败的服务列表
systemctl --failed

# 杀死一个服务的所有子进程
systemctl kill RegisterCenter

# 重新加载一个服务的配置文件
systemctl reload RegisterCenter

#移除标记为丢失的 Unit 文件。在删除 Unit 文件后,由于缓存的关系,
#即使通过 daemon-reload 更新了缓存,在 list-units 中依然会显示标记为 not-found 的 Unit
systemctl reset-failed RegisterCenter

service文件组成

控制单元(Unit)

主要包括服务描述、启动顺序和依赖关系。

Description:当前服务的简单描述;

Documentation:文档位置;

After:在什么服务之后启动;

Before:在什么服务之前启动;

说明:After和Before字段只涉及启动顺序,不涉及依赖关系。
 

Wants:表示“弱依赖”关系。某服务停止运行或退出不影响该服务继续运行;

Requires:表示”强依赖”关系。列在其中的Uint模块会在这个服务启动的同时被启动,如果其中任意一个启动失败,这个服务会被终止。某服务停止运行或退出,该服务也必须停止运行。

说明:Wants字段与Requires字段只涉及依赖关系,与启动顺序无关,默认情况下是同时启动的。
 

PartOf:该参数仅用于单元的停止或重启。

服务定义(service)

Type

定义启动类型。可设置的值如下:

simple(默认值):ExecStart字段启动的进程为主进程;

forking:ExecStart字段以fork()方式启动,父进程退出后,子进程将成为主进程;

oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务;

dbus:类似于simple,但会等待 D-Bus 信号后启动;;

notify:类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务;

idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混;

Environment

为服务设置环境变量

EnvironmentFile

加载包含服务所需环境变量参数的文件。

PIDFile

该服务PID文件的路径(一般位于 /run/ 目录下)。 建议在 Type=forking 的情况下明确设置此选项。 如果设为相对路径,那么表示相对于 /run/ 目录。 systemd 将会在此服务启动完成之后,从此文件中读取主服务进程的PID 。 systemd 不会写入此文件,但会在此服务停止后删除它(若仍然存在)。

ExecStart

启动程序时执行的命令。例如:

# %d为启动时需要传入的参数
ExecStart=/usr/bin/ping 127.0.0.%d

ExecReload

重启服务执行的命令。例如:

ExecReload=/bin/kill -s -HUP $MAINPID  

表示终止主进程且不产生core dump,重启服务。

ExecStop

通知服务时执行的命令。例如:

ExecStop=/bin/kill -s QUIT $MAINPID

表示中断退出的方式终止进程且产生core dump,停止服务。

ExecStartPre

启动服务之前执行的命令。

ExecStartPost

启动服务之后执行的命令。

ExecStopPost

停止服务之后执行的命令。

KillMode

定义systemd如何停止sshd服务。设置值如下:

l control-group(默认值):当前控制组里面的所有子进程,都会被杀掉;

l process:只杀主进程;

l mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号;

l none:没有进程会被杀掉,只是执行服务的 stop 命令;

Restart

定义sshd退出后,systemd的重启方式。设置值如下:

no(默认值):退出后不会重启;

on-success:只有正常退出时(退出状态码为0),才会重启;

on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启;

on-abnormal:只有被信号终止和超时,才会重启;

on-abort:只有在收到没有捕捉到的信号终止时,才会重启;

on-watchdog:超时退出,才会重启;

always:不管是什么退出原因,总是重启;

说明:对于守护进程,推荐设为on-failure。对于那些允许发生错误退出的服务,可以设为on-abnormal。
 

退出原因/设置值

no

always

on-success

on-failure

on-abnormal

on-abort

on-watchdog

正常退出

退出码不为0

进程被强制杀死

操作超时

看门狗超时

服务出现情况与重启对应表

SuccessExitStatus

额外定义其他的进程"正常退出"状态。 也就是,在退出码"0"、以及表示"正常退出"的 SIGHUP, SIGINT, SIGTERM, SIGPIPE 信号之外, 再额外添加一组表示"正常退出"的退出码或信号。 可以设为一系列以空格分隔的数字退出码或者信号名称, 例如:

SuccessExitStatus=1 2 8 SIGKILL

表示当进程的退出码是 1, 2, 8 或被 SIGKILL 信号终止时, 都可以视为"正常退出"。

如果多次使用此选项, 那么最终的结果将是多个列表的合并。 如果将此选项设为空, 那么先前设置的列表 将被清空。

RestartSec

重启服务之前需要等待的秒数。

WorkingDirectory

指定服务工作目录

User

指定运行服务的用户。

PrivateTmp

设置true表示在进程的文件系统名字空间中挂载私有的/tmp和/var/tmp目录,也就是不与名字空间外的其他进程共享临时目录。这样做会增加进程的临时文件安全性,但同时也让进程之间无法通过/tmp或/var/tmp目录进行通信。

安装部分(Install)

用来定义如何启动以及是否开机启动。

WantedBy

表示该服务所在的Target。 Target的含义是服务组,表示一组服务。“WantedBy=multi-user.target”指的是服务所在的Target是multi-user.target。

multi-user.target是systemd默认启动的Target,表示在这个组里的所有服务,都开机启动。

RequiredBy

依赖当前服务的模块。它的值是一个或多个 target,执行enable命令时,符号链接会放入/etc/systemd/system目录下以 target 名 + .required后缀构成的子目录中。

Alias

当前Unit可用于启动的别名。

Also

当前 Unit 被 enable/disable 时,会被同时操作的其他 Unit

Target

概念

Target 就是一个 Unit 组,包含许多相关的 Unit 。启动某个 Target 的时候,Systemd 就会启动里面所有的 Unit。

命令

# 查看当前系统的所有 Target
$ systemctl list-unit-files --type=target

# 查看一个 Target 包含的所有 Unit
$ systemctl list-dependencies multi-user.target

# 查看启动时的默认 Target
$ systemctl get-default

# 设置启动时的默认 Target
$ systemctl set-default multi-user.target

# 切换 Target 时,默认不关闭前一个 Target 启动的进程,systemctl isolate 命令改变这种行为,关闭前一个 Target 里面所有不属于后一个 Target 的进程

启动流程

读入 /boot 目录下的内核文件;

内核文件加载完之后,开始执行第一个程序/sbin/init 初始化进程,由 Systemd 初始化系统引导,完成相关的初始化工作;

Systemd 执行default.target ,获知设定的启动 target (查看默认 target: systemctl get-default);

Systemd 执行启动 target 对应的单元文件。根据单元文件中定义的[依赖关系](bootup Manager Bootup),传递控制权,依次执行其他 target 单元文件,同时启动每个 target 包含的单元

systemd

 

<think>好的,用户想了解如何在systemd服务中获取IPv6地址。首先,我需要回忆一下systemd服务单元配置相关知识。用户可能是在配置某个服务时,需要依赖IPv6地址,或者需要将IPv6地址作为参数传递给服务。 首先,确定用户的需求。他们可能希望服务启动时自动获取IPv6地址,并在服务配置中使用该地址。在systemd中,通常可以通过环境变量或者执行脚本来获取网络信息。比如,使用`ip`命令或者`hostname`命令来获取IPv6地址。 接下来,要考虑不同的网络环境。如果系统使用的是DHCPv6,可能地址是动态分配的,这时候需要确保服务在网络就绪后启动,可以通过`After=network.target`和`Requires=network.target`来设置依赖。此外,使用动态脚本可能会更可靠,比如在服务启动前运行脚本获取IPv6地址,并保存到环境变量中。 然后,处理静态IPv6的情况。如果地址是静态配置的,用户可能已经知道地址,可以直接在service文件中写死。但用户问的是如何获取,说明他们可能需要动态获取的方法。这时候可能需要结合`ExecStartPre`步骤,运行命令提取IPv6地址,并传递给主进程。 另外,可能需要考虑多个IPv6地址的情况,比如系统有多个接口或多个地址,这时候需要确定选择哪个地址。例如,使用`ip -6 addr show dev eth0 | grep inet6`之类的命令,并结合`sed`或`awk`来提取特定地址,比如全局单播地址。 还要注意systemd单元中的配置语法,比如使用`EnvironmentFile`来加载环境变量,或者在`ExecStart`中直接嵌入命令替换。同时,确保服务单元有正确的依赖关系,避免在网络未准备好时执行获取IP的命令。 可能用户会遇到的问题包括:命令输出处理不正确,导致获取到错误的IP;服务启动顺序问题,网络未就绪导致获取失败;或者权限问题,执行ip命令需要足够权限。这时候可能需要考虑在脚本中加入错误处理,或者使用`systemd-networkd-wait-online.service`来确保网络就绪。 总结步骤应该是:编写脚本或内联命令获取IPv6地址,在service文件中配置前置步骤或环境变量,并设置正确的依赖关系。同时,提供示例配置会帮助用户更好地理解如何实现。</think>在Linuxsystemd服务中获取IPv6地址可通过以下步骤实现: --- ### **步骤1:确认网络接口名称** 首先需明确要获取IPv6地址的网络接口名称(如`eth0`、`ens3`等): ```bash ip -6 addr show ``` --- ### **步骤2:编写获取IPv6的脚本/命令** 通过脚本提取IPv6地址(示例为获取首个全局单播地址): ```bash #!/bin/bash ipv6=$(ip -6 addr show dev eth0 | grep 'inet6.*global' | awk '{print $2}' | cut -d'/' -f1) echo "IPV6_ADDR=$ipv6" > /tmp/ipv6.env ``` --- ### **步骤3:创建systemd服务单元文件** 创建`.service`文件(如`/etc/systemd/system/my-service.service`),核心配置如下: ```systemd [Unit] Description=My IPv6 Service After=network.target Requires=network.target [Service] # 通过脚本获取IPv6地址 ExecStartPre=/path/to/your/ipv6-script.sh # 加载环境变量 EnvironmentFile=/tmp/ipv6.env # 主程序使用变量(示例) ExecStart=/usr/bin/myapp --ipv6=${IPV6_ADDR} [Install] WantedBy=multi-user.target ``` --- ### **方法2:直接内联命令** 如果无需单独脚本,可在`ExecStart`中直接嵌入命令替换: ```systemd ExecStart=/usr/bin/myapp --ipv6=$(ip -6 addr show dev eth0 | grep 'inet6.*global' | awk '{print $2}' | cut -d'/' -f1) ``` --- ### **关键注意事项** 1. **网络依赖** 必须通过`After=network.target`确保服务在网络就绪后启动。 2. **地址过滤规则** - `grep 'global'`:过滤全局单播地址 - `grep 'temporary'`:过滤隐私扩展临时地址 - 根据需求调整过滤条件 3. **多地址处理** 若存在多个IPv6地址,可能需要细化提取逻辑(如`head -n1`取首个地址)。 4. **权限问题** 确保服务具有执行`ip`命令的权限(通常不需要特殊配置)。 --- ### **验证服务配置** ```bash # 重载systemd配置 sudo systemctl daemon-reload # 启动服务并查看日志 sudo systemctl start my-service journalctl -u my-service -f ``` --- ### **扩展方案:动态环境变量** 通过`systemd.exec`直接传递变量(需systemd v239+): ```systemd [Service] ExecStart=/usr/bin/myapp Environment=IPV6_ADDR=$(ip -6 addr show eth0 | grep 'global' | awk '{print $2}' | cut -d'/' -f1) ``` 通过上述方法,可灵活地将IPv6地址集成到systemd服务中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值