核心是创建符合规范的.service单元文件,包含[Unit](描述与依赖)、[Service](Type、ExecStart、Restart等)和[Install](WantedBy)三节;存于/etc/systemd/system/,设权限644,执行daemon-reload、enable、start,并用status和journalctl调试。

在 Linux 中编写自定义的 systemd 服务脚本,核心是创建一个符合 systemd 规范的 .service 单元文件,并将其放入系统服务目录、启用并启动。关键在于理解单元文件结构、权限设置和调试方法。
服务单元文件的基本结构
一个典型的 .service 文件包含三个主要区块:[Unit](描述与依赖)、[Service](运行行为)和 [Install](启用配置)。例如,为一个 Python 脚本 /opt/myapp/app.py 创建服务:
[Unit] Description=My Custom App After=network.target StartLimitIntervalSec=0 [Service] Type=simple User=myuser WorkingDirectory=/opt/myapp ExecStart=/usr/bin/python3 /opt/myapp/app.py Restart=always RestartSec=10 KillMode=process [Install] WantedBy=multi-user.target
-
Type=simple表示主进程即为服务进程;若用forking,需配合PIDFile= -
Restart=always让 systemd 在异常退出后自动重启;StartLimitIntervalSec=0取消启动频率限制(仅调试时建议) -
KillMode=process避免终止整个 cgroup,只杀主进程(适合不派生子进程的程序)
放置位置与权限设置
自定义服务推荐放在 /etc/systemd/system/(系统级)或 ~/.config/systemd/user/(用户级),前者需 root 权限,后者无需。
师生共创生态系统对接指南。当用户需要对接大学政策、平台资源、投资机构、产业伙伴等外部资源支持时使用。触发词:师生共创生态、大学支持、平台赋能、投资对接、产业合作、政策支持、清华x-lab、孵化器、创业资源
- 保存为
/etc/systemd/system/myapp.service - 确保文件属主为 root,权限为
644:sudo chown root:root /etc/systemd/system/myapp.service && sudo chmod 644 /etc/systemd/system/myapp.service - 如果脚本或配置文件由非 root 用户运行,确认该用户对相关路径有读/执行权限
启用、启动与调试服务
写完文件后必须重载配置才能识别新服务:
- 重载配置:
sudo systemctl daemon-reload - 启用开机自启:
sudo systemctl enable myapp.service - 立即启动:
sudo systemctl start myapp.service - 查看状态:
systemctl status myapp.service(重点关注Active:和最后几行日志) - 实时查看日志:
journalctl -u myapp.service -f,可加--since "2 minutes ago"过滤时间
常见问题排查要点
服务启动失败通常源于路径、权限或环境差异。systemd 默认不加载用户 shell 的环境变量(如 $PATH 或 $HOME):
- 用绝对路径写
ExecStart=,避免依赖 PATH - 需要环境变量时,在
[Service]中添加:Environment="PATH=/usr/local/bin:/usr/bin:/bin"或EnvironmentFile=/etc/myapp/env - 若程序依赖网络就绪,用
After=network-online.target并启用systemd-networkd-wait-online.service - 测试命令是否能手动运行成功:
sudo -u myuser /usr/bin/python3 /opt/myapp/app.py

















