首页 > 解决方案 > 如何运行多个命令 systemd

问题描述

我想在 systemd 的 myapp.service 文件中执行多个命令

[Unit]
Description=to serve myapp

[Service]
User=ubuntu
WorkingDirectory=/home/ubuntu/myapp
ExecStart=/home/ubuntu/.local/bin/pserve production.ini http_port=5000
ExecStart=/home/ubuntu/.local/bin/pserve production.ini http_port=5001
Restart=always

[Install]
WantedBy=multi-user.target

它抛出错误说无效的论点。我想运行两个命令

pserve production.ini http_port=5000
pserve production.ini http_port=5001

我怎么做??

标签: systemd

解决方案


您可以从一个 systemd 单元启动多个后台进程,但 systemd 将无法为您跟踪它们并执行它为支持守护进程所做的所有好事,例如在各种系统事件或自动重启时向其发送信号需要的时候。

如果您必须将其作为一个单元,那么您可以执行以下操作之一(按我的偏好顺序):

  • 使两台服务器分开(请注意,您可以为两者使用相同的配置文件,因此它们是同一服务的两个“实例” - 这是有道理的,它们运行同一台服务器)。当您运行“systemctl”时,您将在正在运行的服务列表中有两个条目。

  • 使该单元成为一次性的(运行退出且不受监视和重新启动的程序)。使一次性命令在后台启动两个服务器,例如,

    sh -c " { pserve production.ini http_port=5000 & pserve production.ini http_port=5001 & } </dev/null >/dev/null >&1"

  • 制作一个脚本来启动守护进程并监视它们,如果需要重新启动它们,并在它自己被杀死时杀死它们。然后将该脚本设置为 systemd 运行的“守护进程”。不值得,IMO - 因为您正在做 systemd 本身最适合做的大部分工作。当然,您可以旋转配置为仅运行这两个服务器的 systemd 的新副本(并将该 systemd 设置为您的“一个服务换两个命令”单元),但这似乎有点过头了。


推荐阅读