在Ubuntu上使用Upstart的Python服务

我想创建并部署一个心跳服务(一个Python脚本),并使用Upstart将其作为一个服务运行。 我的理解是,我需要添加一个名为/etc/init/myheartbeatservice.conf的文件,并包含以下内容。
# my heartbeat service 

description     "Heartbeat monitor"

start on startup
stop on shutdown

script
    exec /path/to/my/python/script.py
end script 
我的脚本启动另一个服务进程,并监控这些进程并定期向外部服务器发送心跳。"startup"和"shutdown"是正确的事件吗? 此外,我的脚本创建了一个新线程。我假设我还需要将"fork daemon"添加到我的配置文件中吗? 谢谢。
1个回答

启动是upstart在其执行的最开始发出的事件。对于大多数服务来说,这个时间太早了。您此时可能没有以下内容:

  • 网络连接以查找DNS或avahi中的主机名(如果是移动系统,您可能根本没有这个,但对于服务器,情况是不同的)
  • 一个可写的文件系统(在检查后才能写入)
  • /usr 中的Python!(有时 /usr 位于单独的分区中)

关闭实际上并不是一个事件,尽管这个想法在将来的版本中已经讨论过了。

现在,您最好坚持旧的unix方法,并使用运行级别来控制何时启动和停止。

start on runlevel [2345]
stop on runlevel [^2345]
运行级别是识别系统状态的旧Unix方式。[2345]只是用于“多用户”模式的所有运行级别的集合,即使在笔记本电脑上也意味着正常工作的系统。如果您使用此功能,可以确保文件系统和任何静态网络都已启动。99%的upstart作业应该使用这两个启动/停止条件。 通过设置停止条件,如果系统进入任何不是2、3、4或5的运行级别,upstart将停止服务。运行级别0用于停机,1用于“系统维护模式”,6用于重启。 最终,我们将为这些抽象添加更好的名称,但这些名称始终有效。 另外,在那里您不需要scriptend scriptexec关键字将直接执行您的程序。这将节省几毫秒的时间,因为您无需执行/bin/sh并解析exec ...行,因为upstart已经解析了作业文件。