如何在Windows上启动守护进程从python?

我的python脚本能产生一个无限期运行的进程吗?

我并不太熟悉python,也不会产生deamons,所以我想到了这个:

si = subprocess.STARTUPINFO() si.dwFlags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.CREATE_NEW_CONSOLE subprocess.Popen(executable, close_fds = True, startupinfo = si) 

该进程继续运行python.exe,但是一closurescmd窗口就closures。

Solutions Collecting From Web of "如何在Windows上启动守护进程从python?"

使用答案 Janne Karila指出,这是如何运行一个不会死的进程,当它的父母死亡时,不需要使用win32process模块。

 DETACHED_PROCESS = 8 subprocess.Popen(executable, creationflags=DETACHED_PROCESS, close_fds=True) 

DETACHED_PROCESS是一个进程创建标志 ,被传递给底层的CreateProcess函数。

为此目的,你可以守护你的Python进程,或者你正在使用Windows环境,你想运行这个作为一个Windows服务。

你知道我喜欢讨厌只发布网页链接:

但要了解更多信息,请根据您的要求:

一个简单的方法来实现Windows服务 。 阅读所有意见,将解决任何疑问

如果你真的想了解更多

首先阅读这个

什么是守护进程或创建守护进程的python方式

更新:子进程不是实现这种事情的正确方法

这个问题在3年前就被问到了,虽然答案的基本细节没有改变,但是鉴于其在“Windows Python守护进程”搜索中的普遍性,我认为为未来Google的收益增加一些讨论可能会有所帮助。

这个问题实际上有两个部分:

  1. Python脚本能产生一个无限期运行的独立进程吗?
  2. Python脚本能像Windows系统上的Unix守护进程一样吗?

第一个答案是肯定的, 正如已经指出的那样; 使用subprocess.Popencreationflags=subprocess.CREATE_NEW_PROCESS_GROUP关键字就足够了:

 import subprocess independent_process = subprocess.Popen( 'python /path/to/file.py', creationflags=subprocess.CREATE_NEW_PROCESS_GROUP ) 

请注意,至少在我的经验中, CREATE_NEW_CONSOLE在这里不是必要的。

这就是说,这个策略的行为与Unix守护进程期望的不一样。 什么构成一个行为良好的Unix守护进程最好在别处解释 ,但总结一下:

  1. 关闭打开的文件描述符(通常是所有这些描述符,但是某些应用程序可能需要保护某些描述符免于关闭)
  2. 将进程的工作目录更改为合适的位置以防止“目录繁忙”错误
  3. 更改文件访问创建掩码(Python世界中的os.umask
  4. 将应用程序移动到后台并使其与启动进程分离
  5. 完全离开终端,包括将STDINSTDOUTSTDERR重定向到不同的流(通常是DEVNULL ),并防止重新获取控制终端
  6. 处理信号,特别是SIGTERM

实际情况是,作为一个操作系统,Windows并不支持守护进程的概念:从一个终端(或任何其他交互式上下文,包括从资源管理器启动等)开始的应用程序将继续运行有一个可见的窗口,除非控制应用程序(在这个例子中,Python)已经包含了一个无窗口的GUI。 另外,Windows的信号处理是非常不足的,并且尝试向独立的 Python进程发送信号(而不是终止关闭的子进程)几乎总是会导致Python进程没有任何清理的直接退出finally: ,没有atexit ,没有__del__等)。

将应用程序转换为Windows服务虽然在许多情况下是可行的替代方案,但也不太适合。 使用pythonw.exe (与所有最新的Windows Python二进制文件一起提供的无窗口版本的Python )也是如此。 尤其是,它们不能改善信号处理的情况,并且它们不能轻易地从终端启动应用程序并在启动时与其交互(例如,为您的脚本提供动态启动参数,也许是密码,文件路径等), “守护进程” 之前 。 另外,Windows服务需要安装,尽管在第一次调用“守护进程”的时候可以在运行时快速完成,但是修改了用户的系统(注册表等),如果你来自一个Unix世界。

鉴于此,我会争辩说,使用subprocess.CREATE_NEW_PROCESS_GROUP进程启动pythonw.exepythonw.exe可能是Python进程模拟传统Unix守护进程的最接近Windows的等效工具。 然而,这仍然给你带来了信号处理和启动通信所带来的额外挑战(更不用说让代码依赖于平台了,这总是令人沮丧)。

所有人都说,对于将来遇到这个问题的人来说,我已经推出了一个名为daemoniker的库,它包含了适当的Unix守护进程上述策略。 它还实现了信号处理(用于Unix和Windows系统),并允许使用pickle将对象传递给“守护进程”进程。 最重要的是,它有一个跨平台的API :

 from daemoniker import Daemonizer with Daemonizer() as (is_setup, daemonizer): if is_setup: # This code is run before daemonization. do_things_here() # We need to explicitly pass resources to the daemon; other variables # may not be correct is_parent, my_arg1, my_arg2 = daemonizer( path_to_pid_file, my_arg1, my_arg2 ) if is_parent: # Run code in the parent after daemonization parent_only_code() # We are now daemonized, and the parent just exited. code_continues_here()