我正在尝试在python中创建独立的进程。这些进程是一个python脚本,我希望有多个实例,但实例化了不同的参数。 简单地说,从for循环开始,我调用subprocess.Popen(),但args会相应变化:
for d in mylist:
subprocess.Popen(['./subscriber.py', d.arg1, a.arg2, d.arg3])
在subscriber.py中,我有代码根据各种recipes“守护”流程 除此之外,我还试图用:
启动我的subscriber.py.for d in mylist:
p = multiprocessing.Process(target=subscriber.start,
args=(d.arg1, d.arg2, d.arg3))
p.daemon=True
p.start()
我的脚本还使用python日志记录来写入公共日志文件。
任何一种方法都会发生的事情是,只有我循环的最后一次迭代的过程才会实际运行。我需要的是让这些后台守护进程“永远”运行,但我只能得到1个实例! [编辑]重要的是,我希望调用线程终止,留下这一堆正在运行的守护进程,运行..
我已经googled远远地,在stackoverflow和其他地方,似乎找不到类似的例子。也许它是我的python新手......我的方法是完全错误的吗?
环境: - Python-2.7,ubuntu linux
答案 0 :(得分:0)
2件事(除了将流程附加到上面提到的列表中):
When a process exits, it attempts to terminate all of its daemonic child processes.
。对!此外,守护不能产生孩子。带我到: 2.你应该做的是生成具有守护进程= False的子进程,并且每个子进程在启动时将使用fork()进行守护。像这样:
def daemonize():
pid = os.fork()
if pid != 0:
sys.exit(0)
return pid
答案 1 :(得分:0)
如果你真的不需要一个只有Python的解决方案,那么一个小的shell脚本可以完成这项工作:
while read ARGS; do
nohup ./subscriber.py $ARGS &
done < mylist.txt
其中mylist.txt
包含单独行上每个subscriber.py
实例的参数。
nohup
“守护”任何命令,&
将其推送到后台。这意味着当产生该命令的会话结束时,nohup-ed命令将成为init进程的子进程(PID = 1)并继续运行。