def get_process_for_ros_node(self, node_name): target_node = None caller_id = '/experiment_manager' master = rosgraph.Master(caller_id) running_nodes = rosnode.get_node_names() for node in running_nodes: if node_name in node: if target_node is None: target_node = node else: rospy.logwarn("Multiple nodes found whose name " "contains " + node_name) return None if target_node is None: rospy.logwarn("Could not find a node whose name contains " + node_name) return None target_node_api = rosnode.get_api_uri(master, target_node) if not target_node_api: rospy.logwarn("Could not connect to " + target_node + "'s API") return None target_node = ServerProxy(target_node_api) target_node_pid = rosnode._succeed( target_node.getPid(caller_id)) # NOLINT rospy.loginfo('Registered %s node PID %i for resource ' 'usage tracking' % (node_name, target_node_pid)) return psutil.Process(target_node_pid)
def getnodepkg1(self, node_name): socket.setdefaulttimeout(1.0) master = roslib.scriptutil.get_master() node_api = rosnode.get_api_uri(master, node_name) host = node_api.split(':')[1].lstrip('/') node = xmlrpclib.ServerProxy(node_api) try: pid = rosnode._succeed(node.getPid(rosnode.ID)) except socket.error: print("Communication with [%s=%s] failed!"%(node_name,node_api)) return [''] cmd = ['ps','ww','--pid',str(pid)] if os.environ['ROS_IP'] != host and os.environ['ROS_HOSTNAME'] != host: ssh_target = self.user + '@' + host if self.user else hostname cmd = ['ssh', ssh_target] + cmd self.add_pkginfo_remote(host) ps = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0] res = ps[ps.find('/'):] node_args = res.split(' ') parsed = node_args[0].split('/') pkgnames = [pkg[0] for pkg in self.pkginfo[host]] result = [dirname for dirname in parsed if (dirname in pkgnames)] if len(result) == 0: result = [''] return result
def main(): rospy.init_node('start_user_mon', anonymous=True) try: from xmlrpc.client import ServerProxy except ImportError: from xmlrpclib import ServerProxy ID = '/rosnode' master = rosgraph.Master(ID, master_uri=None) global process, loc process = {} loc = rospy.get_param("/script_location") while not rospy.is_shutdown(): nodes = rosnode.get_node_names() for node in nodes: name = " " + node name = name[2:] node_api = rosnode.get_api_uri(master, node) if not node_api: continue node = ServerProxy(node_api) pid = rosnode._succeed(node.getPid(ID)) if process.has_key(pid): continue process[pid] = name print("nohup " + loc + "/usage-mon " + str(pid) + " " + name + " &") os.system("nohup " + loc + "/usage-mon " + str(pid) + " " + name + " &")
def getnodepkg1(self, node_name): socket.setdefaulttimeout(1.0) master = roslib.scriptutil.get_master() node_api = rosnode.get_api_uri(master, node_name) host = node_api.split(':')[1].lstrip('/') node = xmlrpclib.ServerProxy(node_api) try: pid = rosnode._succeed(node.getPid(rosnode.ID)) except socket.error: print("Communication with [%s=%s] failed!" % (node_name, node_api)) return [''] cmd = ['ps', 'ww', '--pid', str(pid)] if os.environ['ROS_IP'] != host and os.environ['ROS_HOSTNAME'] != host: ssh_target = self.user + '@' + host if self.user else hostname cmd = ['ssh', ssh_target] + cmd self.add_pkginfo_remote(host) ps = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0] res = ps[ps.find('/'):] node_args = res.split(' ') parsed = node_args[0].split('/') pkgnames = [pkg[0] for pkg in self.pkginfo[host]] result = [dirname for dirname in parsed if (dirname in pkgnames)] if len(result) == 0: result = [''] return result
def get_topicname_by_node(nodename): master = xmlrpclib.ServerProxy(os.environ['ROS_MASTER_URI']) try: state = rosnode._succeed(master.getSystemState(rospy.get_name())) except socket.error: raise ROSNodeIOException("Unable to communicate with master!") pubs = [t for t, l in state[0] if nodename in l] subs = [t for t, l in state[1] if nodename in l] return pubs, subs # in,out
def discover_ros_nodes(self): self.nodes = {} node_names = rosnode.get_node_names() logging.info("Known nodes: " + ', '.join(node_names)) for node_name in node_names: logging.info(" " + node_name) node_api = rosnode.get_api_uri(self.master, node_name) if not node_api: sys.stderr.write(" API URI: error (unknown node: %s)" % str(node_name)) continue logging.info(" API URI: " + node_api) node = ServerProxy(node_api) pid = rosnode._succeed(node.getPid(ID)) logging.info(" PID : " + str(pid)) self.nodes[node_name] = {} self.nodes[node_name]['uri'] = node_api self.nodes[node_name]['pid'] = pid
def check(self): while not rospy.is_shutdown(): ID = '/rosnode' master = rosgraph.Master(ID, master_uri="http://tbw:11311/") node_api = rosnode.get_api_uri(master, '/gazebo') msg = Bool() try: node = ServerProxy(node_api) pid = rosnode._succeed(node.getPid(ID)) if not self._pid_running(pid): msg.data = False self._pid_pub.publish(msg) else: msg.data = True self._pid_pub.publish(msg) except TypeError: os.system("killall gzserver") msg.data = False self._pid_pub.publish(msg) exit()
# lots of things 'borrowed' from rosnode try: from xmlrpc.client import ServerProxy except ImportError: from xmlrpclib import ServerProxy parser = argparse.ArgumentParser() parser.add_argument('ROS_MASTER_URI', type=str, nargs='?', metavar='URI', help='ROS master URI to use.') args = parser.parse_args() ID = '/rosnode' master = rosgraph.Master(ID, master_uri=args.ROS_MASTER_URI) print ("Using master at {}".format(master.getUri())) nodes = rosnode.get_node_names() print ("Known nodes: " + ', '.join(nodes)) for node in nodes: print (" " + node) node_api = rosnode.get_api_uri(master, node) if not node_api: print(" API URI: error (unknown node: {}?)".format(node)) continue print (" API URI: " + node_api) node = ServerProxy(node_api) pid = rosnode._succeed(node.getPid(ID)) print (" PID : {}".format(pid))