Linux中管理多实例应用最规范的方式是使用systemd模板服务(your-service@.service),通过% i占位符动态区分实例,避免配置冗余与维护困难。

Linux 中管理多实例应用,最规范的方式是用 systemd 模板服务(your-service@.service),它用一个文件定义所有实例共性,靠 %i 占位符动态区分每个实例,避免复制粘贴、配置散乱和维护困难。
创建模板服务文件
在 /etc/systemd/system/ 下新建带 @ 符号的单元文件,例如:
sudo nano /etc/systemd/system/myapp@.service
关键点:
- 文件名必须含
@,且以.service结尾,这是 systemd 识别模板的标志 - 所有路径、参数中需隔离实例的部分,都要包含
%i,比如日志路径、数据目录、端口配置 - 推荐把实例专属配置(如监听端口、数据库地址)抽到独立配置文件,例如
/etc/myapp/conf.d/%i.conf,再通过EnvironmentFile=加载
模板内容示例与关键配置
一个典型模板结构如下:
[Unit]<br> Description=MyApp Instance %i<br> After=network.target<br> StartLimitIntervalSec=0<br> <br> [Service]<br> Type=simple<br> User=myapp<br> Group=myapp<br> WorkingDirectory=/opt/myapp/instances/%i<br> EnvironmentFile=/etc/myapp/conf.d/%i.conf<br> ExecStart=/opt/myapp/bin/start.sh --instance=%i<br> Restart=on-failure<br> RestartSec=5<br> MemoryMax=512M<br> CPUQuota=50%<br> StandardOutput=journal<br> StandardError=journal<br> <br> [Install]<br> WantedBy=multi-user.target
说明:
-
%i在Description、WorkingDirectory、EnvironmentFile、ExecStart等处自动替换为实际实例名(如prod、staging) -
MemoryMax和CPUQuota可按实例单独设限,实现资源硬隔离 -
StartLimitIntervalSec=0关闭启动频率限制,适合调试阶段;生产环境可保留默认值
启用与日常操作
模板定义后不直接启用,而是按需启动具体实例:
- 启动实例:
systemctl start myapp@prod.service - 设为开机自启:
systemctl enable myapp@prod.service - 查看状态:
systemctl status myapp@prod - 查日志:
journalctl -u myapp@prod -f - 列出所有已启动实例:
systemctl list-units 'myapp@*.service'
每次修改模板后,必须运行 systemctl daemon-reload 才能让新配置生效。
进阶建议:统一调度与依赖管理
若多个实例共享底层组件(如本地 Redis 或配置中心),可在 [Unit] 段声明依赖:
-
Wants=redis-local.service表示“尝试启动”,不影响自身启动流程 -
After=redis-local.service保证启动顺序
若需对整组实例做资源统管,可指定 slice:
- 在
[Service]中添加Slice=myapp.slice - 再创建
/etc/systemd/system/myapp.slice,设置整体内存或 CPU 上限


















