【问题标题】:How can you create a independent process with python running in the background如何在后台运行python创建一个独立的进程
【发布时间】:2019-08-27 13:10:51
【问题描述】:

我正在尝试创建一个独立的幕后进程,该进程完全由 python 自己运行。是否有可能创建这样一个进程,即使在退出 python 脚本后,该进程仍然在后台运行。我用 pyinstaller 创建了一个 .exe 文件,我希望该文件在后台运行而不会弹出控制台,这样用户就不会知道该过程,除非他经常打开他的任务管理器。

多处理模块有助于创建进程,但在脚本执行完成后它们会被终止。与线程模块相同。

即使在脚本完成执行之后,是否有可能让某些特定的代码在后台运行?还是完全在后台启动整个脚本而不显示任何控制台?

我曾尝试使用多处理模块中的 Process 类和线程模块中的 Thread 类,但脚本执行后全部退出。甚至 subprocess 和 os 模块也被证明无济于事

from multiprocessing import Process
from threading import Thread

def bg_func():
   #stuff

def main():
   proc = Process(target=bg_func,args=())  #Thread alternatively
   proc.start()

【问题讨论】:

  • 为什么不使用 systemd 服务?

标签: python-3.x multithreading process subprocess background-process


【解决方案1】:

当我发现这个问题时,我能看到的唯一解决方案是执行Double Fork。这是一个有效的示例。

import os
import time
from multiprocessing import Process


def bg():
    # ignore first call 
    if os.fork() != 0:
        return
    print('sub process is running')
    time.sleep(5)
    print('sub process finished')


if __name__ == '__main__':
    p = Process(target=bg)
    p.start()
    p.join()
    print('exiting main')
    exit(0)

输出显示子进程启动,主程序退出状态0,我的提示在后台程序打印最后一行之前返回。我们在后台运行。 :D

[0] 10:58 ~ $ python3 ./scratch_1.py
exiting main
sub process is running
[0] 10:58 ~ $ sub process finished

【讨论】:

  • 我从未用 print 测试过它,但我似乎无法使用它来保持服务器运行。朋友建议我把子进程Popen函数中的创建标志设置为CREATE_NEW_PROCESS_GROUP
  • 在不知道服务器在做什么的情况下很难说什么,但假设它正在等待输入或处于循环中,这应该可以工作。
  • 当我使用 Process 类运行我的脚本时,它没有执行,而它在 Thread 类中运行良好。我知道这很奇怪,但这是真的。有什么方法可以在 subprocess.Popen() 中执行函数吗?因为在我将主脚本编译成 exe 后,我需要一些东西来使用 subprocess.Popen 调用该 exe 文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多