启动单个python脚本,因为命令行参数不同的进程不同

时间:2016-04-08 20:08:39

标签: python linux process

我有python脚本,它接受命令行参数。我获取命令行参数的方法是通过读取mongo数据库。我需要迭代mongo查询并使用mongo查询中的不同命令行参数为单个脚本启动不同的进程。

关键是,我需要启动的流程:

  • 单独进程无共享
  • 在杀死这个过程时,我需要能够轻易杀死它们。

我认为命令killall -9 script.py可以工作并满足第二个约束条件。

修改1

从下面的答案中,launcher.py程序看起来像这样

def main():


    symbolPreDict = initializeGetMongoAllSymbols()
    keys = sorted(symbolPreDict.keys())

    for symbol in keys:
            # Display key.
            print(symbol)
            command = ['python', 'mc.py', '-s', str(symbol)]
            print command
            subprocess.call(command)

if __name__ == '__main__':
     main()

问题是mc.py有一个阻止

的调用
receiver = multicast.MulticastUDPReceiver ("192.168.0.2", symbolMCIPAddrStr, symbolMCPort ) 
while True: 
    try:
        b = MD()

        data = receiver.read() # This blocks
        ...
    except Exception, e:
        print str(e)

当我运行启动器时,它只执行mc.py中的一个(至少有39个)。如何修改启动程序以说“在后台运行已启动的脚本”,以便脚本返回启动程序以启动更多脚本?

修改2

通过将subprocess.call(command)替换为subprocess.Popen(command)

来解决问题

但有一件事我注意到,如果我说ps ax | grep mc.py,那么PID似乎完全不同。我认为我不在乎,因为我可以使用killall轻松杀死它们。

[更正]用pkill -f xxx.py

杀死他们

1 个答案:

答案 0 :(得分:1)

从脚本启动脚本有几种选择。最简单的可能是使用subprocessos模块。

我已多次这样做以启动集群中的节点分离。使用os可能看起来像这样:

import os
for i in range(len(operations)):
     os.system("python myScript.py {:} {:} > out.log".format(arg1,arg2))

使用killall你应该没有问题终止以这种方式产生的进程。

另一种选择是使用subprocess,它具有广泛的功能,并且比os.system更灵活。示例可能如下所示:

import subprocess
for i in range(len(operations)):
    command = ['python','myScript.py','arg1','arg2']
    subprocess.call(command)

在这两种方法中,进程都是独立的,除了父PID之外别无共享。