如何运行os.system通过不同的pid启动进程?

时间:2018-09-02 02:44:05

标签: python-3.x apache-zookeeper

import os
from kazoo.client import KazooClient
signal.signal(signal.SIGINT, signal_handler)

def signal_handler(signal,frame):
    print('\nYou pressed Ctrl+C!')
    print("Stopping...Process  "+process_id)
    print()
    children = zk.get_children("/assign2/root")
    l = [int(i[3:]) for i in children]
    l.remove(int(process_id))
    print("Min process id : ",min(l))
    zk.delete("/assign2/root/pid"+process_id, recursive=True)
    #To run a command on terminal --> os.system("python3 zook.py")
    if(int(process_id)==min(l)):
        print("Starting new process through :" , min(l))
        os.system("python3 zook.py")
    os.kill(int(process_id),0)
    zk.stop()
    sys.exit(0)

zk = KazooClient(hosts='127.0.0.1:2181')
zk.start()

zk.ensure_path("/assign2/root")
zk.create("/assign2/root/pid"+process_id, bytes(process_id, encoding='utf-8'),ephemeral=True)

在杀死进程时,我想找到剩余的最小pid,然后通过最小的pid开始一个进程。
我正在使用zookeeper将pids存储为ephemeral znodes,并在终端中终止python脚本后,正在尝试创建另一个进程。
我可以通过我要终止的进程的pid创建一个进程,但是不能从我选择的另一个pid中创建一个进程。

请告诉我是否有办法做到这一点。

1 个答案:

答案 0 :(得分:0)

因此,这里您需要监视所有不同的进程(每个进程监视所有其他进程),并等待进程失败。在动物园管理员的世界中,可以通过以下方式实现:

1)Zookeeper监视:每个Zookeeper客户端(进程)都可以在父znode(在您的情况下为/ assign2 / root /)上设置监视,并监视CHILD_DELETE事件。您可以查看zookeeper文档和指定库(kazoo)的文档,以了解如何执行此操作。设置手表时,您可以指定每次在父znode下的znode消失时将异步执行的回调。这可能是因为:

  • 子znode是临时的,而创建该子节点的zk客户端 znode死了。
  • 客户端明确删除了子节点。例如,您可以在信号处理程序中删除子节点。

在此回调中,每个活动的zookeeper客户端/进程将确定其排名最低的进程ID(通过获取父级znode下所有现有子级的列表),以及是否确实是最小的pid。将产生新进程(python3 zook.py)。

请注意,动物园管理员的手表是一次性的防火概念。这意味着在触发监视后(即执行了回调),您将希望在回调执行的最后重置监视,以便下一个子删除事件也将导致触发回调。

2)另一种方法是轮询。在每个进程中,您都可以有一个专用线程,该线程可以定期监视父znode的子进程,并且每次进程检测到某个节点消失时,它都可以再次确定其最低活动pid并生成一个新进程。 ,如果确实如此。

希望这会有所帮助。如果您有任何疑问,请告诉我。本来希望发布您所需的代码,但必须执行某项任务。