Commands on Exit Codes

Once the task of a job has terminated you can call various commands depending on its exit code (see commands element).

These commands are particularly "start_job" and "add_order".

Both commands are supported in JOE:

  • Go to command
  • Add a new command
  • Set the exit code for which the command will be called
  • Use the add job or add order buttons to select the command

There are other rare use cases for commands (see list of XML commands).

Other commands may also be indicated in JOE, however, you have to use the "edit XML" function in the context menu of a job to add such commands. A panel will be displayed where you can insert the command.

Example for a Standalone Job

We assume a standalone job (./config/live/test/call_test.job.xml) which calls a shell script. This shell script returns various exit codes.

  • If the exit code is 1 then the job stops.
  • If the exit code is 5 then the job restarts in 1 hour.
  • All other exit codes can be ignored and will treated in the same way as the exit code 0.

<job>
  <script language="shell"><![CDATA[
./config/live/test/test.sh
  ]]></script>
  <run_time]>
    <period single_start="12:00"/>
    <period begin="00:00:01" end="24:00"/>
  </run_time>
</job>

Without API

  1. Set the job attribute stop_on_error to the value no
  2. Add command for exit code 1: <modify_job job="/test/call_test" cmd="stop"/>
  3. Add command for exit code 5: <start_job job="/test/call_test" at="now + 01:00"/>
  4. Complete the shell script in which you store the exit code and change it in accordance with the requirement
     
  ./config/live/test/test.sh
  RC=$?
  case "$RC" in
  	"0")	echo "Script has ended with exit code $RC"
  		;;
  	"1")	echo "Script has ended with exit code $RC" >&2
  		echo "Job will stopped" >&2
  		;;
  	"5")	echo "Script has ended with exit code $RC" >&2
  		echo "Job restarts in 1 hour"
  		;;
  	*) 	echo "Script has ended with exit code $RC" >&2
  		echo "Exit code changed to 0"
  		RC=0
  		;;
  esac
  exit $RC

 

The above example is added to a job definition like this:
 

<job stop_on_error="no">
  <script language="shell"><![CDATA[
 ./config/live/test/test.sh
 RC=$?
 case "$RC" in
 	"0")	echo "Script has ended with exit code $RC"
 		;;
 	"1")	echo "Script has ended with exit code $RC" >&2
 		echo "Job will stopped" >&2
 		;;
 	"5")	echo "Script has ended with exit code $RC" >&2
 		echo "Job restarts in 1 hour"
 		;;
 	*) 	echo "Script has ended with exit code $RC" >&2
 		echo "Exit code changed to 0"
 		RC=0
 		;;
 esac
 exit $RC
  ]]></script>
  <run_time>
    <period single_start="12:00"/>
    <period begin="00:00:01" end="24:00"/>
  </run_time>
  <commands on_exit_code="1">
    <modify_job job="/test/call_test" cmd="stop"/>
  </commands>
  <commands on_exit_code="5">
    <start_job job="/test/call_test" at="now + 01:00">
      <params><copy_params from="task"/></params>
    </start_job>
  </commands>
</job> 

With API

  1. Set the job attribute stop_on_error to the value no (a checkbox right above in the job main formular in JOE)
  2. Add Pre-/Post-processing and insert the following Javascript lines.
function spooler_task_after() {
 	spooler_job.clear_delay_after_error();
 	var rc = spooler_task.exit_code;
 	switch(rc) {
 		case  0 : 
 			spooler_log.info("Script ended with exit code " + rc);
 			break;
 		case  1 : 
 			spooler_log.error("Script ended with exit code " + rc);
 			spooler_log.error("Job will stop");
 			spooler_job.set_delay_after_error(1, "stop");
 			break;
 		case  5 : 
 			spooler_log.error("Script ended with exit code " + rc);
 			spooler_log.info("Job restarts in 1 hour");
 			spooler_job.state_text = "Job restarts in 1 hour";
 			spooler_job.set_delay_after_error( 1, "01:00:00" );
 			break;
 		default : 
 			spooler_log.warn("Script ended with exit code " + rc);
 			spooler_log.info("Exit code changed to 0");
 			spooler_task.exit_code = 0;
 			break;
 	}
}

 

The above example is added to a job definition like this:

 

<job stop_on_error="no">
  <script language="shell"><![CDATA[
 ./config/live/test/test.sh
  ]]></script>
  <monitor name="exit_code_handler" ordering="0">
    <script language="java:javascript"><![CDATA[
function spooler_task_after() {
 	spooler_job.clear_delay_after_error();
 	var rc = spooler_task.exit_code;
 	switch(rc) {
 		case  0 : 
 			spooler_log.info("Script ended with exit code " + rc);
 			break;
 		case  1 : 
 			spooler_log.error("Script ended with exit code " + rc);
 			spooler_log.info("Job will stop");
 			spooler_job.state_text = "Job will stop";
 			spooler_job.set_delay_after_error( 1, "stop" );
 			break;
 		case  5 : 
 			spooler_log.error("Script ended with exit code " + rc);
 			spooler_log.info("Job restarts in 1 hour");
 			spooler_job.state_text = "Job restarts in 1 hour";
 			spooler_job.set_delay_after_error( 1, "01:00:00" );
 			break;
 		default : 
 			spooler_log.warn("Job ended with exit code " + rc);
 			spooler_log.info("Exit code changed to 0");
 			spooler_task.exit_code = 0 ;
 			break;
 	}
}
             ]]>
         </script>
     </monitor>
     <[http://www.sos-berlin.com/doc/en/scheduler.doc/xml/run_time.xml run_time]>
        <period single_start="12:00"/>
        <period begin="00:00:01" end="24:00"/>
     </run_time>
 </job>

Example for an Order Job 

We assume an order job (./config/live/test/call_test.job.xml) which calls a shell script. This shell script returns various exit codes.

  • If the exit code is 1 then the order should stop.
  • If the exit code is 5 then the order should restart in 1 hour.
  • All other exit codes can be ignored and will be treated as exit code  0.
     
<job order="yes" stop_on_error="no">
  <script] language="shell"><![CDATA[
 ./config/live/test/test.sh
  ]]></script>
</job>

Usage with the API

  1. Set the job attribute stop_on_error to the value no (a checkbox right above in the job main form in JOE)
  2. Add Pre-/Post-processing and insert the below Javascript line

The above example is added to a job definition like this:

 

<job order="yes" stop_on_error="no">
  <script language="shell"><![CDATA[
 ./config/live/test/test.sh
  ]]></script>
  <monitor name="exit_code_handler" ordering="0">
    <script language="java:javascript"><![CDATA[
function spooler_task_after() {
    spooler_job.clear_delay_after_error();
    var rc = spooler_task.exit_code;
    switch( rc ) {
        case  0 :
            spooler_log.info("Script ended with exit code " + rc);
            break;
        case  1 :
            spooler_log.error("Script ended with exit code " + rc);
            spooler_log.error("suspend order");
                        spooler_task.order.suspended = true ;
                        spooler_task.order.state = spooler_task.order.state;
            break;
        case  5 :
            spooler_log.error("Script ended with exit code " + rc);
            spooler_log.info("Order restarts job in 1 hour");
            spooler_job.state_text = "Order restarts job in 1 hour";
                        spooler_job.set_delay_order_after_setback( 1, "01:00" );
                        spooler_job.max_order_setbacks = 1;
            spooler_log.error("setback order");
                        spooler_task.order.setback();
            break;
        default :
            spooler_log.warn("Script ended with exit code " + rc);
            spooler_log.info("Exit code changed to 0");
            spooler_task.exit_code = 0;
                        var next_state = spooler_task.order.job_chain_node.next_state;
                        spooler_log.info("order state changed to " + next_state);
                        spooler_task.order.state = next_state;
            break;
    }
 } 
    ]]></script>
  </monitor>
</job>