为多模块应用程序创建系统服务脚本

Create a systemd service script for multiple module app

我目前正在用 Pyro4 和 Flask 编写一个 python 应用程序分支。 为了启动应用程序,我需要:

  1. 启动 pyro4 名称服务器
  2. 在 pyro4 名称服务器中注册我的对象
  3. 启动一个 flask 网络应用来访问 pyro4 对象

我想使用 systemd 服务文件来执行此操作。 我首先考虑将 ExecStarPre 和 ExecStarPost 用于 运行 pyro4 名称服务器和烧瓶网络应用程序;但似乎这些字段不适用于长运行命令...

我是否需要制作 3 个 systemd 服务,这些服务在我从第 4 个 systemd 服务调用的 bash 脚本中启动?

谢谢你帮助我

我正在尝试编写 systemd 服务文件

你不需要四个systemd服务;三个应该做。

  • pyro-nameserver.service:Pyro 名称服务器
  • mysvc-objects.service:自定义 Pyro 对象的服务器。使用 Requires=pyro-nameserver.serviceAfter=pyro-nameserver.service
  • mysvc.service:实际的 Flask webapp。使用 Requires=mysvc-objects.serviceAfter=mysvc-objects.service 确保它仅在名称服务器已经启动并且您的对象已注册时才尝试启动。

您应该在任何情况下都不要ExecStartPreExecStartPost启用或禁用systemd服务。

顺便说一句,有一点有点棘手的事情是控制 systemd 何时认为某些东西“启动”以便仅在该服务完成初始化并准备好使用后启动链中的下一个服务。在一个完美的情况下,你会用 Type=notify 构建服务, use sd_notify("READY=1") 在它们完成初始化时告诉 systemd 吗?但如果您还没有构建它,可以选择构建一个 ExecStartPost 脚本,该脚本会等到与其关联的服务实际 运行 才会退出。