Linux自定义服务编写_systemd单元文件说明【指导】

14次阅读

必须编写符合systemd规范的.service单元文件,包含[Unit](描述与依赖)、[Service](Type、ExecStart等)、[Install](WantedBy)三节;按Type=simple、forking或oneshot配置启动行为,并通过daemon-reload、enable、start及journalctl验证。

Linux自定义服务编写_systemd单元文件说明【指导】

如果您需要在linux系统中将自定义脚本或程序作为系统服务长期运行,则必须为其编写符合systemd规范的单元文件。以下是编写systemd服务单元文件的具体步骤与说明:

一、理解service单元文件基本结构

systemd服务单元文件以.service为后缀,由多个节(Section)组成,每个节以方括号标识,如[Unit]、[Service]、[Install]。各节承担不同职责:[Unit]描述服务元信息及依赖关系;[Service]定义进程启动行为;[Install]控制服务启用状态。

1、创建纯文本文件,命名格式为your-service-name.service,存放于/etc/systemd/system/目录下。

2、文件开头必须包含[Unit]节,并至少设置Description字段,用于描述服务用途。

3、[Service]节中必须指定Type(如simple、forking、oneshot等)和ExecStart(指定可执行命令路径)。

4、[Install]节中需配置WantedBy字段(如multi-user.target),否则systemctl enable将报错。

二、编写最小可用service单元文件

最简可行的服务单元文件仅需满足systemd语法校验与基础启动能力,不依赖复杂逻辑或环境变量

1、使用文本编辑器新建文件:sudo nano /etc/systemd/system/hello-world.service

2、写入以下内容:

[Unit]
Description=Hello World Test Service
After=network.target

[Service]
Type=oneshot
ExecStart=/bin/echo “Hello from systemd!”
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

3、保存并退出编辑器。

4、重新加载unit配置:sudo systemctl daemon-reload

三、配置守护进程类服务(Type=simple)

适用于前台持续运行的常驻进程,如自定义http服务器、日志监听器等,systemd默认等待ExecStart启动的主进程结束即视为服务终止。

1、确保目标程序支持前台运行且不自动转入后台(禁用daemonize选项)。

2、在[Service]节中设置:Type=simple,并指定完整路径的ExecStart命令。

3、添加Restart策略防止意外退出:Restart=on-failure,RestartSec=5可设定重启延迟。

4、如需限制资源,可加入MemoryLimit=512M、CPUQuota=50%等参数。

四、适配传统SysV风格后台服务(Type=forking)

针对调用fork()两次、父进程立即退出的传统守护进程(如早期nginxredis-server),systemd需识别真正的主进程PID。

1、在[Service]节中声明:Type=forking

2、必须提供PIDFile=路径,指向服务写入的PID文件(如/var/run/myapp.pid)。

3、ExecStartPre可前置执行创建运行目录或授权操作,例如:ExecStartPre=/usr/bin/mkdir -p /var/run/myapp

4、确认对应程序实际生成PID文件,否则systemd无法追踪主进程,导致start超时失败。

五、启用并验证服务配置

完成单元文件编写后,需通过systemd工具链验证语法正确性、权限合规性及运行时行为是否符合预期。

1、检查语法错误:sudo systemd-analyze verify /etc/systemd/system/your-service-name.service

2、启用服务(开机自启):sudo systemctl enable your-service-name.service

3、立即启动服务:sudo systemctl start your-service-name.service

4、查看实时日志:sudo journalctl -u your-service-name.service -f

text=ZqhQzanResources