class_docstr: Execute using PBS/Torque
  
  The plugin_args input to run can be used to control the SGE execution.
  Currently supported options are:
  
  - template : template to use for batch job submission
  - qsub_args : arguments to be prepended to the job execution script in the
                qsub call
  - max_jobname_len: maximum length of the job name.  Default 15.
code: def _submit_batchtask(self, scriptfile, node):
      cmd = CommandLine(
          "qsub",
          environ=dict(os.environ),
          resource_monitor=False,
          terminal_output="allatonce",
      )
      path = os.path.dirname(scriptfile)
      qsubargs = ""
      if self._qsub_args:
          qsubargs = self._qsub_args
      if "qsub_args" in node.plugin_args:
          if (
              "overwrite" in node.plugin_args
              and node.plugin_args["overwrite"]
          ):
              qsubargs = node.plugin_args["qsub_args"]
          else:
              qsubargs += " " + node.plugin_args["qsub_args"]
      if "-o" not in qsubargs:
          qsubargs = f"{qsubargs} -o {path}"
      if "-e" not in qsubargs:
          qsubargs = f"{qsubargs} -e {path}"
      if node._hierarchy:
          jobname = ".".join(
              (dict(os.environ)["LOGNAME"], node._hierarchy, node._id)
          )
      else:
          jobname = ".".join((dict(os.environ)["LOGNAME"], node._id))
      jobnameitems = jobname.split(".")
      jobnameitems.reverse()
      jobname = ".".join(jobnameitems)
      jobname = jobname[0 : self._max_jobname_len]
      cmd.inputs.args = f"{qsubargs} -N {jobname} {scriptfile}"
  
      oldlevel = iflogger.level
      iflogger.setLevel(logging.getLevelName("CRITICAL"))
      tries = 0
      while True:
          try:
              result = cmd.run()
          except Exception as e:
              if tries < self._max_tries:
                  tries += 1
                  # sleep 2 seconds and try again.
                  sleep(self._retry_timeout)
              else:
                  iflogger.setLevel(oldlevel)
                  raise RuntimeError(
                      f"Could not submit pbs task for node {node._id}\n{e}"
                  )
          else:
              break
      iflogger.setLevel(oldlevel)
      # retrieve pbs taskid
      taskid = result.runtime.stdout.split(".")[0]
      self._pending[taskid] = node.output_dir()
      logger.debug(f"submitted pbs task: {taskid} for node {node._id}")
  
      return taskid
  
file_path: nipype/nipype/pipeline/plugins/pbs.py
imports: import os
  from time import sleep
  from ...None import logging
  from ...interfaces.base import CommandLine
  from .base import SGELikeBatchManagerBase, logger
label_desc: Use image node_id 3 for calling the PBSPlugin obj's underlying member method code with example usage: obj._submit_batchtask(scriptfile, node) and returns: taskid