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

如果您需要在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()两次、父进程立即退出的传统守护进程(如早期nginx、redis-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










