簡體   English   中英

python中的守護程序生成已失效/僵屍的Linux進程

[英]Daemon in python generates defunct/zombie linux process

我正在嘗試從Flask應用程序中生成長進程。 因此,我有一個主要流程來處理傳入的Web請求,並使用python-daemon庫從中啟動守護程序。 這是一個最小的工作示例:

import os
import time
import daemon
import lockfile

def daemon_function():
    return True

working_directory = os.path.dirname(os.path.abspath(__file__))
pid_file = os.path.join(working_directory,"my_daemon.pid")

daemon_context = daemon.DaemonContext(
        working_directory=working_directory,
        pidfile=lockfile.FileLock(pid_file),
    )

pid = os.fork()
if pid == 0:
    with daemon_context:
        daemon_function()

time.sleep(10)

當主進程仍在運行時使用linux命令ps -ef時,守護進程終止后,我看到以下輸出:

user     2484     1  0 09:38 ?        00:00:01 /lib/systemd/systemd --user
user    11269  6061  0 12:07 pts/2    00:00:00 bash
user    28817 11269  1 15:43 pts/2    00:00:00 python test_daemon.py
user    28818 28817  0 15:43 pts/2    00:00:00 [python] <defunct>

我在with daemon_context:語句之前使用fork函數的原因是,我需要主進程才能繼續。

我是否應該擔心已創建的已終止進程(我可能會產生很多)? 我如何避免這個僵屍出現?

如果您不想創建僵屍進程,則應等待它們完成,即執行wait系統調用而不是sleep:

import os
import time
import daemon
import lockfile

def daemon_function():
    return True

working_directory = os.path.dirname(os.path.abspath(__file__))
pid_file = os.path.join(working_directory,"my_daemon.pid")

daemon_context = daemon.DaemonContext(
        working_directory=working_directory,
        pidfile=lockfile.FileLock(pid_file),
    )

pid = os.fork()
if pid == 0:
    with daemon_context:
        daemon_function()

os.waitpid(pid, 0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM