% 
% Licensed to the Apache Software Foundation (ASF) under one
% or more contributor license agreements.  See the NOTICE file
% distributed with this work for additional information
% regarding copyright ownership.  The ASF licenses this file
% to you under the Apache License, Version 2.0 (the
% "License"); you may not use this file except in compliance
% with the License.  You may obtain a copy of the License at
% 
%   http://www.apache.org/licenses/LICENSE-2.0
% 
% Unless required by applicable law or agreed to in writing,
% software distributed under the License is distributed on an
% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
% KIND, either express or implied.  See the License for the
% specific language governing permissions and limitations
% under the License.
% 
% Create well-known link to this spot for HTML version
\ifpdf
\else
\HCode{<a name='DUCC_VIADUCC'></a>}
\fi
    \section{viaducc and java\_viaducc}
    \label{sec:cli.viaducc}

    \paragraph{Description:}
        Viaducc is a small script wrapper around the \hyperref[sec:cli.ducc-process-submit]{\em
          ducc\_process\_submit } CLI to facilitate launching processes on DUCC-managed machines,
          either from the command line or from an Eclipse run configuration.

        \begin{sloppypar}
          When run from the command line as ``viaducc'', the arguments are bundled into the form expected by
          \hyperref[sec:cli.ducc-process-submit]{\em ducc\_process\_submit } and submitted to DUCC.
          By default the remote stdin and stdout of the deployed process are mapped back to the 
          command line terminal.
        \end{sloppypar}
        
        If a symbolic link to the viaducc script is created with the name ``java\_viaducc''
        and used from the command line,
        the arguments are assumed to be a Java classname and its arguments.
        The java process will be executed using DUCC's default JRE, or
        optionally, a specific JRE supplied by the user with a -D argument.

        If the ``java\_viaducc'' symbolic link is installed in a JRE/bin directory, DUCC will use
        the java executable from the same directory. More interestingly, it may be specified as an alternative
        to the ``java'' command in an eclipse launcher.  The remote stdin and stdout of the deployed
        DUCC process are redirected to the Eclipse console.  This provides essentially transparent
        execution of code in an Eclipse workspaces on DUCC-managed resources.

    \paragraph{Usage:}
\begin{verbatim}
     viaducc [defines] [command and parameters]
\end{verbatim}
     or
\begin{verbatim}
     java_viaducc [defines] [java-class and parameters]
\end{verbatim}

     The ``defines'' are described below.  The ``command and parameters'' are either any command
     (with full path) and it's arguments, or a Java class (with a ``main'') and its arguments (including
     the classpath if necessary.)

     \paragraph{Defines}

     The arguments are specified in the syntax of Java ``-D'' system properties, to be more consistent
     with execution under Eclipse.
     \begin{description}
         \item[-DDUCC\_MEMORY\_SIZE] This specifies the memory required, in GB.  If not specified, the
           smallest memory quanta configured for the scheduler is used.
         \item[-DDUCC\_CLASS] This is the scheduling class to submit the process to.  It should generally
           be a non-preemptable class.  If not specified, it defaults to class ``fixed''.
         \item[-DDUCC\_ENVIRONMENT] This species additional environment parameters to pass to the job.
           It should specify a quoted string of blank-delimited K=V environment values.  For example:
\begin{verbatim}
      -DDUCC_ENVIRONMENT="DUCC_RLIMIT_NOFILE=1000 V1=V2 A=B"
\end{verbatim}
         \item[-DJAVA\_BIN] This species the exact ``java'' command to use, for ``java\_viaducc''.  It
           must be a full path to some JRE that is known to be installed on all the DUCC nodes.  If not
           specified, the JRE used to run ducc is used.
         \item[-DDUCC\_DESCRIPTION] The description string to use for the submission.
           If not specified, the description defaults to the executable name, viaducc or java\_viaducc.
         \item[-DDUCC\_NO\_CANCEL\_ON\_INTERRUPT] If specified this no-argument option disables 
           automatic process cancellation when the submitting process terminates before the remote process.
    \end{description}
        
