def METHOD_NAME(self, cmd, env=None, log_name=None,
            copyable_env=None, **kwargs):
    """!The command cmd is a string which is converted to a produtil
    exe Runner object and than run. Output of the command may also
    be redirected to either METplus log, MET log, or TTY.
    Some subclasses of CommandBuilder ie. series_by_init_wrapper, run
    non MET commands ie. convert, in addition to MET binary commands,
    ie. regrid_data_plane.
    Args:
        @param cmd: A string, Command used in the produtil exe Runner object.
        @param env: Default None, environment for run to pass in, uses
        os.environ if not set.
        @param log_name: Used only when ismetcmd=True, The name of the exectable
        being run.
        @param kwargs Other options sent to the produtil Run constructor
    """
    if cmd is None:
        return cmd
    # if env not set, use os.environ
    env = os.environ if env is None else env
    self.logger.info("COMMAND: %s" % cmd)
    # don't run app if DO_NOT_RUN_EXE is set to True
    if self.skip_run:
        self.logger.info("Not running command (DO_NOT_RUN_EXE = True)")
        return 0, cmd
    log_name = log_name if log_name else os.path.basename(cmd.split()[0])
    # Determine where to send the output from the MET command.
    log_dest = self.get_log_path(log_filename=log_name+'.log')
    # determine if command must be run in a shell
    run_inshell = '*' in cmd or ';' in cmd or '<' in cmd or '>' in cmd
    # KEEP This comment as a reference note.
    # Run the executable in a new process instead of through a shell.
    # FYI. We were originally running the command through a shell
    # which also works just fine. IF we go back to running through
    # a shell, The string ,cmd, is formatted exactly as is needed.
    # By formatted, it is as it would be when typed at the shell prompt.
    # This includes, for example, quoting or backslash escaping filenames
    # with spaces in them.
    # Run the executable and pass the arguments as a sequence.
    # Split the command in to a sequence using shell syntax.
    the_exe = shlex.split(cmd)[0]
    the_args = shlex.split(cmd)[1:]
    if log_dest:
        self.logger.debug("Logging command output to: %s" % log_dest)
        self.log_header_info(log_dest, copyable_env, cmd)
        if run_inshell:
            cmd_exe = exe('sh')['-c', cmd].env(**env).err2out() >> log_dest
        else:
            cmd_exe = exe(the_exe)[the_args].env(**env).err2out() >> log_dest
    else:
        if run_inshell:
            cmd_exe = exe('sh')['-c', cmd].env(**env)
        else:
            cmd_exe = exe(the_exe)[the_args].env(**env).err2out()
    # get current time to calculate total time to run command
    start_cmd_time = datetime.now()
    # run command
    try:
        ret = run(cmd_exe, **kwargs)
    except Exception:
        ret = -1
    else:
        # calculate time to run
        end_cmd_time = datetime.now()
        total_cmd_time = end_cmd_time - start_cmd_time
        self.logger.info(f'Finished running {the_exe} '
                         f'- took {total_cmd_time}')
    return ret, cmd