将Python进程作为适当的守护进程(以及Windows服务可选)

时间:2019-01-08 18:29:15

标签: python linux daemon python-daemon

我正在实现一个运行24/7的程序。它会每隔15秒左右连续执行任务,但是,某些任务可能需要花费任意时间才能运行(超过15秒),因此建议不要在运行该任务时对同一worker执行其他操作(某些任务涉及虚拟机实例的部署和消除)。使用无状态cronjob进行此操作将需要复杂的锁逻辑,而锁逻辑很难扩展,因此这不是一个选择。

该程序具有复杂且繁重的状态,基本上是处理作业调度,检查状态,重新启动无效作业并更新最终结果的核心或大型集群,因此,建议始终将其作为核心运行系统。

现在,完整的软件被实现为线程的子类。线程已经解决了所有并发问题。

系统的端点是一个非常简单的脚本,该脚本从参数和文件中读取配置,并使用'em'初始化线程类。之后,它将运行start()方法并永远等待,如果因某种原因崩溃则重新启动主类。

我想要做的是使用开始/停止和一个简单的状态方法将这个简单的类实现为well-behaved daemon process(现在我正在使用nohup和&来完成工作),并打印出有关运行的信息作业,当前群集的大小等所有纯文本。现在,我有一个信号侦听器,它可以通过优雅地停止线程(如果需要)并将输出打印到文件来模拟stop()和status()。

远程集群及其通信/调度逻辑是使用Pyro4的自定义实现,因此一个选项是在Pyro守护进程中注册主进程本身,因此一种选择是注册可守护类本身并使用一些自定义的python代码连接到它并获取状态,但是,我认为这是过分的,并且依赖于pyro守护程序,这会给系统添加不必要的故障点。

我遇到了几个声称可以创建适当守护程序的库:

这些类看起来足够健壮和简单,可以满足我当前的需求(我还没有找到如何使status()成为部件的一部分,但这必须很简单)。还有其他库可以以更强大的方式做到吗?现在,我没有时间花在守护程序库上进行稳定性检查,所以即使它可能有点基于观点,我也想知道您对此的想法和实践经验。

所有这些都是关于linux守护程序的,但是,有没有任何SIMPLE类可以处理Windows服务以及linux守护程序?由于其他外部限制,我目前的程序仅适用于linux,但将来最好避免对两个不同的分支进行编程。

对于我当前的项目,除了上面所公开的内容外,我只需要其他信息,但是考虑到未来,我希望能够从终端到守护程序发送一些信息。没什么真正复杂的,只是带有简单字符串/数字有效载荷作为参数的命令。

例如,最好有一个“ reload_config”功能,该功能允许我从控制台传递新的配置文件位置。现在,要重新加载配置,我修改了CURRENT配置文件,并告诉过程使用信号再次读取它。这样会减少使用此功能可以实现的可行功能(您可以在已知位置使用临时文件来存储命令并让客户端读取它,但这也不是一个干净的解决方案)

据我所知,实现此目标的唯一正确方法(除了使用通信文件)是:

    线程上的
  • TCP侦听套接字,用于侦听自定义客户端发送的命令。这会引入安全问题,并迫使您创建一些语法不足的语法,使您可以尽可能最有效地表示命令,并增加了通信问题。
  • 一个简单的python网络服务器,充当命令的中间人:客户端发布到网络服务器,线程从那里获取。现在,在以前的情况下,安全性似乎更容易处理(https消除了对密码和中间人攻击的关心),但这仍然是一个问题。
  • 在需要时使用Pyro4从控制客户端远程加载类,这对我来说似乎太脏了。
  • 使用“通信文件”将复杂数据获取/发送到流程。这似乎很脏,完全超出了当前的技术水平。

**注意:当前我正在使用logging.Logger直接登录到文件,这可能是问题吗?据我所知(猜想)不是,但是你永远不知道...

此外,根据此post的第一个答案,“ systemd使许多守护进程过时” ,我不太习惯systemd(一直不愿意升级到现代操作系统直到我不再能够延迟它为止),但是,这种方法我可以立即执行我现在正在做的事情:捕获并正确处理关闭信号并自动启动/杀死systemd中的脚本,这似乎不是足够。

尽管如此,看来除非我实现更复杂的客户端/服务器,否则将无法向我的服务发送带有参数的命令,这是我做错的吗?理想的情况是能够启动这样的命令:

systemctl custom_command python_service custom_argument

尽管如此,我不认为systemd支持这种功能,我错了吗?

无论如何,出于主要问题的目的,这些功能就足够了:

systemctl start python_service 
systemctl stop python_service 
systemctl restart python_service 
systemctl reload python_service 
systemctl status python_service 

1 个答案:

答案 0 :(得分:1)

我想你主要是在问:

  

是否有任何SIMPLE类可以处理Windows服务以及linux守护程序?

由于这两个是非常不同的,我认为答案必须是:否。

根据定义,任何处理这两种方法的类都会非常复杂。