Create: 2013/05/27
LastUpdate: 2013/05/30
ジョブの起動スケジュールを設定するパラメータの <run_time/> には、いろいろなオプションがあります。
ここでは、私が試したオプションをいくつか紹介します。
<run_time/>の詳細は、「マニュアル」を参照してください。
JOCで <run_time/>を設定する
<run_time/> は、JOCでも設定することができます。いろいろ試したい場合は、JOCで設定変更したほうが便利です。
下図のようジョブを右クリックして、メニューから[Set run time]を選択します。
下図のようなダイアログが表示されます。
①~③のいづれかの手段で設定後、[submit]ボタンをクリックすると有効になります。
①、②では、設定内容にしたがって、XML定義が表示されます。
- ①は、[run time editor]ボタンをクリックすると、JOEのようなGUIで設定できます。
- ②は、「 [CentOS6][SOS JobScheduler] カレンダーを設定する」のような任意のカレンダーを設定できます。
- ③は、自分でXML定義を記述します。
下図は、前述の①で表示される run time editor です。
ここで設定後、[OK]ボタンをクリックすると、上図の画面に戻って、XML定義が表示されます。
single_start、begin、end を試す
single_start は、デフォルトの開始時刻を設定します。
begin と end は、運転期間を設定します。デフォルトは、0:00 ~ 23:59 です。
たとえば、毎日 13:00 に実行するジョブは、以下のように定義できます。
<job title="Test Shell Job1"> <params/> <script language="shell"><![CDATA[ echo "$SCHEDULER_JOB_NAME processed $SCHEDULER_ORDER_ID" echo "Current Timestamp: `date '+%Y-%m-%d %H:%M:%S'`" echo "Current Hostname: `uname -n`" echo "Current Username: `whoami`" exit 0 ]]></script> <run_time single_start="13:00" /> </job>このジョブに、以下のように毎日 20:00 ~ 21:00 の運転期間を設定します。
<job title="Test Shell Job1">
<params/>
<script language="shell"><![CDATA[
echo "$SCHEDULER_JOB_NAME processed $SCHEDULER_ORDER_ID"
echo "Current Timestamp: `date '+%Y-%m-%d %H:%M:%S'`"
echo "Current Hostname: `uname -n`"
echo "Current Username: `whoami`"
exit 0
]]></script>
<run_time single_start="13:00">
<period begin="20:00" end="21:00"/>
</run_time>
</job>
single_start は、無視されて、下図のように 20:00 開始でスケジューリングされます。once を試す
once を "yes" に設定すると、1度だけスケジューリングされます。
以下のようにジョブを設定した場合
<job title="Test Shell Job1"> <params/> <script language="shell"><![CDATA[ echo "$SCHEDULER_JOB_NAME processed $SCHEDULER_ORDER_ID" echo "Current Timestamp: `date '+%Y-%m-%d %H:%M:%S'`" echo "Current Hostname: `uname -n`" echo "Current Username: `whoami`" exit 0 ]]></script> <run_time once="yes"> <period begin="20:00" end="21:00"/> </run_time> </job>下図のように、実行予定日時が表示されます。
この予定日時に1回だけ実行して、次の予定はスケジューリングされません。
ちなみに、起動予定のカレンダーには何も表示されません。
なお、この状態で即時実行すると、スケジューリングは解除されます。
再度スケジューリングしたい場合は、[Set run time] で、もう一度、設定します。
repeat、absolute_repeat を試す
begin、end で設定された期間、ジョブを繰り返し実行することができます。
たとえば、毎日、10:00~11:00まで、10分間隔でジョブを繰り返し実行したい場合は、以下のように定義できます。
repeat の部分は、absolute_repeat に替えて設定してもOKです。
<job title="Test Shell Job1" tasks="10">
<params/>
<script language="shell"><![CDATA[
echo "$SCHEDULER_JOB_NAME processed $SCHEDULER_ORDER_ID"
echo "Current Timestamp: `date '+%Y-%m-%d %H:%M:%S'`"
echo "Current Hostname: `uname -n`"
echo "Current Username: `whoami`"
#sleep 13
exit 0
]]></script>
<run_time>
<period begin="10:00" end="11:00" repeat="00:10:00"/>
</run_time>
</job>
repeat には、インターバルの間隔を設定します。ジョブの終了後、repeat で設定された時間を経過したら次の繰り返し実行を開始します。このため、繰り返し実行の開始時間は、ジョブの処理時間に依存して予測できません。たとえば、begin=10:00、end=11:00、repeat=00:10と設定した場合、ジョブの実行時間が10分以内に収まれば以下のように繰り返し実行します。
10:00 → 10:10 → 10:20 → 10:30 → 10:40 → 10:50
もしジョブの実行時間が、毎回13分であれば、以下のように3回繰り返し実行します。繰り返し実行の回数も、開始時間も変わります。
10:00 → 10:23 → 10:46
absolute_repeat も、インターバルの間隔を設定します。begin で設定した運用開始期間から計算して、繰り返し実行を開始します。この場合は、繰り返し実行の開始時間は予測できます。ジョブの処理時間が、インターバル間隔を超えた場合、次の繰り返し実行はスキップされます。
たとえば、begin=10:00、end=11:00、repeat=00:10と設定した場合、ジョブの実行時間が10分以内に収まれば以下のように繰り返し実行します。repeat と同じです。
10:00 → 10:10 → 10:20 → 10:30 → 10:40 → 10:50
もしジョブの実行時間が、毎回13分であれば、以下のように3回だけ繰り返し実行します。繰り返しを予定していた10:10、10:30、10:50 はスキップされて実行回数は減りますが、開始時間は変わりません。
10:00 → 10:20 → 10:40
let_run を試す
StandaloneJobで let_run を設定すると、内部APIを実装したジョブの動作に影響を与えることができます。
let_run には、bigin、end で設定した運用期間内に処理が終わらなかった場合に、次のプロセスステップを続行するかどうかを設定します。
デフォルトは、続行しません。(let_run="no")
たとえば、以下のようなジョブを内部APIで作成します。
このジョブは、spooler_process を7回実行します。1~6回は 10 秒スリープし、7回目で処理を終了します。
<job title="Test Perl Job" warn_if_longer_than="10"> <script language="perlScript"> <![CDATA[ use vars qw ($spooler $spooler_log $spooler_job $spooler_task); $cnt=0; sub spooler_process { $cnt++; print "## spooler_process $cnt times.\n"; if( $cnt < 7 ) { print "## slepp 10 sec.\n"; sleep(10); return 1; } print "## spooler_procces end.\n"; return 0; } sub spooler_exit { print "## spooler_exit.\n"; } ]]> </script> <run_time /> </job>このジョブが、begin、end で設定した時間内に処理を正常終了すると下図のように表示されます。
実行されたプロセスステップ数が7であることがわかります。
次に、let_run="no" にして、bigin、end で設定した期間内に処理が終了しないように run_time を設定します。
<run_time once="yes"> <period begin="14:45" end="14:45:30" let_run="no"/> </run_time>この設定で計画実行されると、下図のように、実行されたプロセスステップ数が3と表示されます。
end で設定した時間を超えたので、処理の途中で停止したことがわかります。
こんどは、let="yes" にして、bigin、end で設定した期間内に処理が終了しないように run_time を設定します。
<run_time once="yes"> <period begin="14:53" end="14:53:30" let_run="yes"/> </run_time>この設定で計画実行されると、下図のように、実行されたプロセスステップが7と表示されます。
end で設定した時間を超えても、最後のプロセスステップまで処理されたことがわかります。
schedule を試す
schedule には適用したいカレンダーを設定します。「 [CentOS6][SOS JobScheduler] カレンダーを設定する」も参照してください。
<run_time schedule="/test/schedule1"/>
when_holiday を試す
休日のスケジューリングをどうするか、以下の選択肢から選んで設定します。
- when_holiday="suppress"
デフォルトです。休日はスケジューリングしません。 - when_holiday="ignore_holiday"
スケジューリングします。 - when_holiday="previous_non_holiday"
直前の営業日にスケジューリングします。 - when_holiday="next_non_holiday"
直後の営業日にスケジューリングします。
<job title="next_non_holiday" tasks="10">
<params/>
<script language="shell"><![CDATA[
echo "$SCHEDULER_JOB_NAME processed $SCHEDULER_ORDER_ID"
echo "Current Timestamp: `date '+%Y-%m-%d %H:%M:%S'`"
echo "Current Hostname: `uname -n`"
echo "Current Username: `whoami`"
exit 1
]]></script>
<run_time when_holiday="suppress" single_start="20:00">
<monthdays>
<day day="29"/>
</monthdays>
<holidays>
<holiday date="2013-05-29"/>
</holidays>
</run_time>
</job>
赤字の部分に4つの選択肢を設定して、スケジューリングされた状態を見てみると、下図のとおり。ジョブ名として、when_holiday の設定値を表示しています。
5/27 の時点で確認した場合です。
"suppress" の場合は、5/29 が休日なので、次の 6/29 に実行するように計画されています。
"ignore_holiday" の場合は、休日を無視して、5/29 に実行するように計画されています。
"previous_non_holiday" の場合は、5/29が休日なので、直前の営業日である 5/28 に実行するように計画されています。
"next_non_hoiday" の場合は、5/29が休日なので、直後の営業日である 5/30 に実行するように計画されています。