Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents
outlinh1. true
outlinh1. true
1printablefalse
2stylh1. none
3indent20px

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).

...

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.

...

Code Block
<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
     
Code Block
languagebash
collapsetrue
  ./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:
 

Code Block
collapsetrue
<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.
    You will find the API documentation at http://www.sos-berlin.com/doc/en/scheduler.doc/api/api.xml.
     
Code Block
languagejs
collapsetrue
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.set_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.set_exit_code( 0 );
 			break;
 	}
}

...

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

 

Code Block
languagexml
collapsetrue
<job stop_on_error="no">
  <script language="shell"><![CDATA[
 ./config/live/test/test.sh
  ]]></script>
  <monitor name="exit_code_handler" ordering="0">
    <script language="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.set_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.set_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.set_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.
     
Code Block
languagexml
<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 lines
    You will find the API documentation at http://www.sos-berlin.com/doc/en/scheduler.doc/api/api.xml.
     
Code Block
languagejs
collapsetrue
function spooler_task_after() {
 	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().set_suspended( true );
                        spooler_task.order().set_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.set_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.set_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().set_state( next_state );
 			break;
 	}
}

...

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

 

Code Block
languagexml
collapsetrue
<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="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().set_suspended( true );
                        spooler_task.order().set_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.set_state_text( "Order restarts job in 1 hour" );
                        spooler_job.set_delay_order_after_setback( 1, "01:00" );
                        spooler_job.set_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.set_state( next_state );
 			break;
 	}
 }
    ]]></script>
  </monitor>
</job>