systemd模板单元通过your-service@.service文件实现多实例服务管理,使用%i等占位符动态注入实例名,支持独立端口、配置路径和用户隔离;需用systemctl start myapp@dev等方式指定实例启动。

用 systemd 模板单元(template unit)为多实例服务配置独立运行环境,核心是创建一个带 @ 符号的服务文件,再通过占位符动态注入实例信息。它不是复制多个 service 文件,而是用一份定义驱动所有实例,既干净又可控。
模板文件命名与位置
必须把服务文件命名为 your-service@.service(末尾的 @ 不可省略),放在 /etc/systemd/system/ 下最稳妥(优先级高于系统默认路径)。例如:
- sudo nano /etc/systemd/system/myapp@.service
关键占位符和参数化写法
模板中用 %i 表示启动时传入的实例名,%n 是完整单元名(如 myapp@dev.service),%u 是运行用户。这些能帮你隔离路径、端口、配置等:
- Description=MyApp instance %i → 启动后显示 “MyApp instance dev”
- ExecStart=/opt/myapp/bin/start.sh --port=80%i --config=/etc/myapp/%i.conf → 实例 dev 启动时用 8001 端口和 dev.conf
- WorkingDirectory=/var/lib/myapp/%i → 每个实例日志、缓存都落在各自子目录下
- User=%i 或 User=app-%i → 可按实例分配不同系统用户,增强隔离性
启动与管理每个实例
模板本身不能直接启动,必须指定实例名。比如你有 dev、staging、prod 三个环境:
- sudo systemctl start myapp@dev
- sudo systemctl enable myapp@staging → 开机自启该实例
- sudo systemctl status myapp@prod → 查看单个实例状态,日志也自动按实例分离
- journalctl -u myapp@dev -f → 实时跟踪 dev 实例日志
复杂配置建议外置处理
如果启动参数太多或逻辑较重,别全堆在 ExecStart 里。推荐两种方式:
- 用 EnvironmentFile=/etc/myapp/%i.env 加载实例专属环境变量
- 让主程序读取 /etc/myapp/%i.conf 配置文件,模板只负责调用入口命令


















