Class Exec

  • All Implemented Interfaces:
    java.lang.Cloneable, Actor, Executable, FiringsRecordable, Initializable, TypedActor, Changeable, Debuggable, DebugListener, Derivable, Instantiable, ModelErrorHandler, MoMLExportable, Moveable, Nameable

    public class Exec
    extends LimitedFiringSource
    Execute a command as a separately running subprocess.

    This actor uses java.lang.Runtime.exec() to invoke a subprocess named by the command parameter in a specified directory with a specified environment. Data from the input port (if any) is passed to the input of the subprocess. The subprocess is run until it exits and then contents of the output and error streams of the subprocess (if any) are passed to the output and error ports.

    If the subprocess generates no data on the output or error stream, then the data on the corresponding port(s) will consist of the empty string.

    To get the effect of executing a command provided in a shell interpreter, set the prependPlatformDependentShellCommand parameter to true. This will prepend a default platform-dependent shell command to the command you wish to execute so that your command is executed within the shell. Alternatively, you can set command to "cmd" (Windows) or "sh" (Windows with Cygwin or Linux), and then provide commands at the input port. In this case, however, your model will only work on platforms that have the shell command you have specified. Note that in this case each command must be terminated with a newline. For example, to open a model in vergil and run it, you can set command to "sh" and use a Const actor to provide on the input port the string:

     "vergil -run model.xml\n exit\n"
     

    A much more interesting actor could be written using a Kahn Process Network. This actor would generate output asynchronously as the process was executing.

    For information about Runtime.exec(), see:
    http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html and http://mindprod.com/jgloss/exec.html.

    Since:
    Ptolemy II 4.0
    Version:
    $Id$
    Author:
    Christopher Hylands Brooks, Contributors: Edward A. Lee, Daniel Crawl
    Pt.AcceptedRating:
    Yellow (cxh) 2/24/04
    Pt.ProposedRating:
    Yellow (cxh) 2/5/04
    • Field Detail

      • command

        public PortParameter command
        The command to be executed. The command is parsed by StringUtilities.tokenizeForExec(String) into tokens and then executed as a separate subprocess. The initial default value is the string echo "Hello, world.".

        The command parameter is read only once during fire(). If you want to spawn another different command, use life cycle management actors such RunCompositeActor.

      • directory

        public FileParameter directory
        The directory in which to execute the command. This parameter is read each time the subprocess is started in fire(). Once the subprocess is running, this parameter is not read again until fire() is called again.

        The initial default value of this parameter $CWD, which corresponds with the value of the Java virtual machine user.dir property which is the user's current working directory. Note that if we are running inside a menu launched application, then ptolemy.actor.gui.jnlp.MenuApplication will change user.dir to be the value of user.home, which is the name of the user's home directory.

        If the value of this parameter is the empty string, then the working directory of the subprocess with be inherited from the working directory of the parent process. Typically, this is the value of the user.dir property.

      • environment

        public Parameter environment
        The environment in which to execute the command. This parameter is read each time the subprocess is started in fire(). Once the subprocess is running, this parameter is not read again until fire() is called again.

        This parameter is an array of records that name an environment variable and the value for the value. The format is:

          {{name = "NAME1", value = "value1"}...}
          
        Where NAME1 is the name of the environment variable, and value1 is the value.

        For example {{name = "PTII", value = "c:/ptII"}} would set the value of the PTII to c:/ptII.

        If the initial value of the parameter is {{name="", value = ""}}, then the environment from the calling or parent process is used in the new command.

        Note that if this parameter sets any environment variable, then under Windows the other environment variables in the calling or parent process might not be passed to the subprocess. This behaviour could be platform or JVM dependent. When in doubt, try setting the command value to "env" to print out the environment.

      • error

        public TypedIOPort error
        Data that is generated by the subprocess on its standard error. While the process is running, any error data generated by the subprocess is stored until the subprocess exits and then the stored error data is sent to the error port. If the subprocess generates no data on standard error, then the empty string (a string of length zero) is generated. This port is an output port of type String.
      • exitCode

        public TypedIOPort exitCode
        The exit code of the subprocess. Usually, a non-zero exit code indicate that the subprocess had a problem. This port is an output port of type int.
      • ignoreIOExceptionReadErrors

        public Parameter ignoreIOExceptionReadErrors
        If true, ignore IOException errors from the subprocess. The initial default value is false, indicating that read errors are not ignored.
      • input

        public TypedIOPort input
        Strings to pass to the standard input of the subprocess. Note that a newline is not appended to the string. If you require a newline, add one using the AddSubtract actor. This port is an input port of type String.
      • prependPlatformDependentShellCommand

        public Parameter prependPlatformDependentShellCommand
        If true, then prepend the platform dependent shell command to the parsed value of the command parameter. By setting this argument to true, it is possible to invoke commands in a platform neutral method.

        Under Windows NT or XP, the arguments "cmd.exe" and "/C" are prepended. Under Windows 95, the arguments "command.com" and "/C" are prepended. Under all other platforms, the arguments "/bin/sh" and "-c" are prepended.

        By prepending sh or cmd, then this actor can use the file redirection operations.

        The default value of this parameter is a boolean of value false, which allows the user to arbitrarily invoke /bin/sh scripts on all platforms.

      • throwExceptionOnNonZeroReturn

        public Parameter throwExceptionOnNonZeroReturn
        If true, then throw an exception if the subprocess returns non-zero. The default is a boolean of value true. This parameter is ignored if waitForProcess is false.
      • waitForProcess

        public Parameter waitForProcess
        If true, then actor will wait until subprocess completes. The default is a boolean of value true.
    • Method Detail

      • fire

        public void fire()
                  throws IllegalActionException
        Invoke a subprocess, read the input data (if any) and wait for the subprocess to terminate before sending any output or error data to the appropriate ports.

        If there is no data on the input port, then the subprocess executes without reading any input. If there is no output or error data from the subprocess, then the empty string is sent to the appropriate port(s).

        Specified by:
        fire in interface Executable
        Overrides:
        fire in class Source
        Throws:
        IllegalActionException - If the subprocess cannot be started, if the input of the subprocess cannot be written, if the subprocess gets interrupted, or if the return value of the process is non-zero.