python 中的守护程序生成 defunct/zombie 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函数,是因为需要主进程继续执行。
我应该担心创建的已失效进程(我可能会产生很多)吗?怎么才能避免这个丧尸出现呢?
如果您不想创建僵尸进程,您应该等待它们完成,即执行等待系统调用而不是睡眠:
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)
我正在尝试从 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函数,是因为需要主进程继续执行。
我应该担心创建的已失效进程(我可能会产生很多)吗?怎么才能避免这个丧尸出现呢?
如果您不想创建僵尸进程,您应该等待它们完成,即执行等待系统调用而不是睡眠:
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)