63 lines
1.3 KiB
Python
Executable File
63 lines
1.3 KiB
Python
Executable File
#!/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
|