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中创建一个进程。
请告诉我是否有办法做到这一点。
答案 0 :(得分:0)
因此,这里您需要监视所有不同的进程(每个进程监视所有其他进程),并等待进程失败。在动物园管理员的世界中,可以通过以下方式实现:
1)Zookeeper监视:每个Zookeeper客户端(进程)都可以在父znode(在您的情况下为/ assign2 / root /)上设置监视,并监视CHILD_DELETE事件。您可以查看zookeeper文档和指定库(kazoo)的文档,以了解如何执行此操作。设置手表时,您可以指定每次在父znode下的znode消失时将异步执行的回调。这可能是因为:
在此回调中,每个活动的zookeeper客户端/进程将确定其排名最低的进程ID(通过获取父级znode下所有现有子级的列表),以及是否确实是最小的pid。将产生新进程(python3 zook.py)。
请注意,动物园管理员的手表是一次性的防火概念。这意味着在触发监视后(即执行了回调),您将希望在回调执行的最后重置监视,以便下一个子删除事件也将导致触发回调。
2)另一种方法是轮询。在每个进程中,您都可以有一个专用线程,该线程可以定期监视父znode的子进程,并且每次进程检测到某个节点消失时,它都可以再次确定其最低活动pid并生成一个新进程。 ,如果确实如此。
希望这会有所帮助。如果您有任何疑问,请告诉我。本来希望发布您所需的代码,但必须执行某项任务。