systemd - 如何运行多个命令 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 将无法为您跟踪它们并执行它为支持守护进程所做的所有好事,例如在各种系统事件或自动重启时向其发送信号需要的时候。
如果您必须将其作为一个单元,那么您可以执行以下操作之一(按我的偏好顺序):
使两台服务器分开(请注意,您可以为两者使用相同的配置文件,因此它们是同一服务的两个“实例” - 这是有道理的,它们运行同一台服务器)。当您运行“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 设置为您的“一个服务换两个命令”单元),但这似乎有点过头了。
推荐阅读
- java - 组件怎么一直到左上角?
- python - 如何根据一列是否具有特定值来查找重复行并删除输出?
- json - 如何访问 API 的不同属性?
- c# - 解析在 Hyper-V 主机上创建的 VM 的 .vmcx 文件
- php - 如何从php执行shell命令?
- ruby - 使用 image_processing 将 --density 标志添加到 libvips 命令?
- javascript - 在反应中测试 onclick 组件
- javascript - 谷歌地图全屏控制在 chrome 上不可见
- c# - 如何使用 C# 从 Outlook 电子邮件中保存/下载附件
- r - 合并重复分数但标记差异