#!/usr/bin/env python USAGE=""" fx-rpc -- run programs written with garry's makeshift sockets api thing """ import os import signal import sys import util import time import random # note: we're not using fx for parameter parsing right now... n = int(sys.argv[1]) if n <= 0: print "error: n must be positive" os.exit(1) peers = os.path.abspath(sys.argv[2]) executable = os.path.abspath(sys.argv[3]) port = random.randrange(10000, 64000) peerlist = util.readlines(peers) pids = {} log = sys.stderr try: for i in range(n): machinename = peerlist[i] print >> log, "****** CONNECTING TO %s ******" % machinename argv = ["ssh", "-x", "-T", "-n", machinename, executable] + sys.argv[4:] + [ "--rpc/n=%d"%n, "--rpc/rank=%d"%i, "--rpc/port=%d"%port, "--rpc/peers=%s"%peers, ] print >> log, " ".join(argv) pid = os.fork() if not pid: os.execvp(argv[0], argv) pids[pid] = 1 while pids: (pid, status) = os.wait() pids.pop(pid) print >> log, "*********** PID %d done!" % pid finally: for pid in pids: try: os.kill(pid, signal.SIGINT) print >> log, "Kill successful for %d" % pid except: try: os.kill(pid, signal.SIGTERM) except: try: os.kill(pid, signal.SIGKILL) except: print >> log, "Kill failed for %d" % pid