'Start a process
@param string name Process name (or ``group:name``, or ``group:*``)
@param boolean wait Wait for process to be fully started
@return boolean result     Always true unless error'

def startProcess(self, name, wait=True):

    self._update('startProcess')
    (group, process) = self._getGroupAndProcess(name)
    if (process is None):
        (group_name, process_name) = split_namespec(name)
        return self.startProcessGroup(group_name, wait)
    try:
        (filename, argv) = process.get_execv_args()
    except NotFound as why:
        raise RPCError(Faults.NO_FILE, why.args[0])
    except (NotExecutable, NoPermission) as why:
        raise RPCError(Faults.NOT_EXECUTABLE, why.args[0])
    if (process.get_state() in RUNNING_STATES):
        raise RPCError(Faults.ALREADY_STARTED, name)
    process.spawn()
    self.supervisord.reap()
    if process.spawnerr:
        raise RPCError(Faults.SPAWN_ERROR, name)
    process.transition()
    if (wait and (process.get_state() != ProcessStates.RUNNING)):
        def onwait():
            if process.spawnerr:
                raise RPCError(Faults.SPAWN_ERROR, name)
            state = process.get_state()
            if (state not in (ProcessStates.STARTING, ProcessStates.RUNNING)):
                raise RPCError(Faults.ABNORMAL_TERMINATION, name)
            if (state == ProcessStates.RUNNING):
                return True
            return NOT_DONE_YET
        onwait.delay = 0.05
        onwait.rpcinterface = self
        return onwait
    return True
