복붙노트

[PYTHON] Windows에서 파이썬으로 데몬 프로세스를 시작하는 방법은 무엇입니까?

PYTHON

Windows에서 파이썬으로 데몬 프로세스를 시작하는 방법은 무엇입니까?

내 파이썬 스크립트가 무기한으로 실행되는 프로세스를 생성 할 수 있습니까?

나는 파이썬이나 산란 마귀들에 익숙하지 않아서 이렇게 생각해 냈습니다.

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

프로세스는 python.exe를지나 계속 실행되지만 cmd 창을 닫으면 닫힙니다.

해결법

  1. ==============================

    1.Janne Karila의 대답을 사용하면 부모가 죽을 때 죽지 않는 프로세스를 실행할 수 있으며 win32process 모듈을 사용할 필요가 없다고 지적했습니다.

    Janne Karila의 대답을 사용하면 부모가 죽을 때 죽지 않는 프로세스를 실행할 수 있으며 win32process 모듈을 사용할 필요가 없다고 지적했습니다.

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

    DETACHED_PROCESS는 기본 CreateProcess 함수로 전달되는 프로세스 생성 플래그입니다.

  2. ==============================

    2.이 질문은 3 년 전에 제기되었으며, "Windows Python 데몬"검색에서 유행성이 있었기 때문에 답변의 근본적인 세부 사항은 변경되지 않았지만 앞으로의 Google 도착을 위해 몇 가지 토론을 추가하는 것이 도움이 될 것이라고 생각했습니다.

    이 질문은 3 년 전에 제기되었으며, "Windows Python 데몬"검색에서 유행성이 있었기 때문에 답변의 근본적인 세부 사항은 변경되지 않았지만 앞으로의 Google 도착을 위해 몇 가지 토론을 추가하는 것이 도움이 될 것이라고 생각했습니다.

    질문에는 실제로 두 부분이 있습니다.

    첫 번째 질문에 대한 대답은 확실한 예입니다. 이미 지적했듯이. creationflags = subprocess.CREATE_NEW_PROCESS_GROUP 키워드로 subprocess.Popen을 사용하면 충분합니다.

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

    적어도 내 경험에 따르면 CREATE_NEW_CONSOLE은 여기에 필요하지 않습니다.

    즉,이 전략의 동작은 유닉스 데몬에서 기대하는 것과 거의 같지 않습니다. 잘 작동하는 유닉스 데몬을 구성하는 것이 다른 곳에서는 잘 설명되어 있지만 요약은 다음과 같습니다.

    실제로 운영 체제 인 Windows는 데몬이라는 개념을 실제로 지원하지 않습니다. 터미널에서 시작하는 응용 프로그램 (또는 탐색기에서의 실행 등 다른 대화식 환경에서 실행되는 응용 프로그램)은 계속 실행됩니다 제어 응용 프로그램 (이 예제에서는 Python)에 윈도우가없는 GUI가 포함되어 있지 않으면 가시적 인 창이 나타납니다. 또한 Windows 신호 처리가 비효율적이며 독립적 인 Python 프로세스에 신호를 보내려고 시도하면 (터미널 프로세스가 종료되지 않는 하위 프로세스와 반대 됨) 거의 모든 정리 작업없이 Python 프로세스가 즉시 종료됩니다 마침내 : no atexit, no __del__ 등).

    응용 프로그램을 Windows 서비스로 롤링하는 것은 많은 경우 실용적인 대안이지만 그다지 적합하지 않습니다. pythonw.exe (모든 최신 Windows Python 바이너리와 함께 제공되는 창없는 Python 버전)를 사용하는 경우에도 마찬가지입니다. 특히 신호 처리의 상황을 개선하지 못하고 터미널에서 응용 프로그램을 쉽게 시작하고 시작할 때 상호 작용할 수 없습니다 (예를 들어 동적 시작 인수를 스크립트에 전달하는 경우, 예를 들어 암호, 파일 경로 등), "daemonizing"전에. 또한 Windows 서비스는 설치가 필요합니다. 처음에는 "데몬"을 호출 할 때 런타임시 완벽하게 수행 할 수 있지만 사용자 시스템 (레지스트리 등)을 수정합니다. 유닉스 세계.

    이 점에서 필자는 subprocess.CREATE_NEW_PROCESS_GROUP을 사용하여 pythonw.exe 하위 프로세스를 시작하면 Python 프로세스가 일반적인 Unix 데몬을 에뮬레이트하는 데 가장 비슷한 Windows라고 생각합니다. 그러나 여전히 신호 처리 및 시작 통신에 대한 추가 과제가 남아 있습니다 (코드를 플랫폼에 종속적으로 만드는 것은 말할 것도없고 항상 실망 스럽습니다).

    이 모든 문제는 미래에이 문제가 발생하는 사람들에게 적절한 유닉스 데몬 화와 위의 전략을 모두 담은 daemoniker라는 라이브러리를 선보였습니다. 또한 (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()
    
  3. ==============================

    3.그 목적을 위해 파이썬 프로세스를 대몬화할 수도 있고, Windows 환경을 사용하면서 이것을 Windows 서비스로 실행하고 싶을 수도 있습니다.

    그 목적을 위해 파이썬 프로세스를 대몬화할 수도 있고, Windows 환경을 사용하면서 이것을 Windows 서비스로 실행하고 싶을 수도 있습니다.

    당신은 내가 웹 링크 만 게시하는 것을 싫어한다는 것을 알고 있습니다.

    그러나 귀하의 요구 사항에 따라 더 많은 정보 :

    Windows 서비스를 구현하는 간단한 방법. 의심스러운 점을 해결할 모든 의견을 읽으십시오.

    더 많은 것을 배우고 싶다면

    먼저 이것을 읽으십시오.

    데몬 프로세스 란 무엇입니까? 아니면 데몬 - 파이썬 방식으로 생성합니까?

    최신 정보: 서브 프로세스가 이런 종류의 일을 성취하는 올바른 방법이 아닙니다.

  4. from https://stackoverflow.com/questions/12843903/how-to-start-daemon-process-from-python-on-windows by cc-by-sa and MIT license