JobSchedulerでスケジュール実行


cronで実行しているスクリプトを単独のジョブから実行するのはできたので、JobSchedulerからチェーンをスケジュール実行する設定をしました。

ジョブファイルの修正

ジョブジェーンに組み込むにはOrderJobにする必要があるので、既存のジョブファイルを修正。

修正前

<job title="backup_files_local" process_class="/test/test_single_process">

修正後
<job title="backup_files_local" process_class="/test/test_single_process" order="yes">

こんな感じで、order="yes"を追加。

ファイルが増えてきて視認性が落ちたので、ファイル名を付け替えて、OrderJob用のサブディレクトリ作って放り込みました。

OrderJobに変更すると、ジョブ名の前のアイコンが"●"に変わり、"タスク即時実行"ができなくなりますが、curlで叩くと、force_start="yes"のおかげなのか実行できます。
なんとなく腑に落ちない挙動。

cronで動かしているスクリプトをチェーンでまとめる

  • MySQL*2、PostgreSQLのバックアップ
  • Oracleの起動確認とバックアップ
  • ファイルのバックアップ
  • 別なサーバへのsyncとZabbix_housekeeper

の4つに分け、実行するためのオーダーとスケジュールはチェーン内ではなく、別に定義することに。

JOE

せっかくなのでJOEを使ってみようと思いましたが、実際に出力されたXMLには親タグが入っており、JOCではエラーとみなされるので手で書くことにしました…

チェーンの設定

MySQL+PostgreSQLバックアップのチェーン

config/live/test/jobchain/chain_mysql_pgsql.job_chain.xml
<job_chain  name="chain_mysql_pgsql" title="chain_mysql_pgsql" max_orders="10" process_class="/test/test_single_process">
  <job_chain_node state="Step1" job="/test/orderjob/backup_db_mysql" next_state="Step2" error_state="Step2"/>

  <job_chain_node state="Step2" job="/test/orderjob/backup_db_mysql_remote" next_state="Step3" error_state="Step3"/>

  <job_chain_node state="Step3" job="/test/orderjob/backup_db_pgsql" next_state="End" error_state="End"/>

  <job_chain_node state="End"/>
</job_chain>

Oracleバックアップのチェーン

config/live/test/jobchain/chain_oracle.job_chain.xml
<job_chain  name="chain_oracle" title="chain_oracle" max_orders="10" process_class="/test/test_single_process">
  <job_chain_node state="Step1" job="/test/orderjob/check_db_oracle" next_state="Step2" error_state="Step2"/>

  <job_chain_node state="Step2" job="/test/orderjob/backup_db_ora" next_state="End" error_state="End"/>

  <job_chain_node state="End"/>
</job_chain>

ファイルバックアップのチェーン

config/live/test/jobchain/chain_file.job_chain.xml
<job_chain  name="chain_file" title="chain_file" max_orders="10" process_class="/test/test_single_process">
  <job_chain_node state="Step1" job="/test/orderjob/backup_svn" next_state="Step2" error_state="Step2"/>
  <job_chain_node state="Step2" job="/test/orderjob/backup_files" next_state="Step3" error_state="Step3"/>

  <job_chain_node state="Step3" job="/test/orderjob/backup_files_remote" next_state="End" error_state="End"/>

  <job_chain_node state="End"/>
</job_chain>

最終処理のチェーン

config/live/test/jobchain/chain_final.job_chain.xml
<job_chain  name="chain_final" title="chain_final" max_orders="10" process_class="/test/test_single_process">
  <job_chain_node state="Step1" job="/test/orderjob/sync_fsv" next_state="Step2" error_state="Step2"/>

  <job_chain_node state="Step2" job="/test/orderjob/zabbix_housekeeper" next_state="End" error_state="End"/>

  <job_chain_node state="End"/>
</job_chain>

全実行のnestチェーン

config/live/test/jobchain/_all_chain.job_chain.xml
<job_chain title="_all_chain">
  <job_chain_node.job_chain state="Chain_01" job_chain="chain_mysql_pgsql" next_state="Chain_02" error_state="Chain_02"/>
  <job_chain_node.job_chain state="Chain_02" job_chain="chain_file" next_state="Chain_03" error_state="Chain_03"/>
  <job_chain_node.job_chain state="Chain_03" job_chain="chain_oracle" next_state="Chain_04" error_state="Chain_04"/>
  <job_chain_node.job_chain state="Chain_04" job_chain="chain_final" next_state="End" error_state="End"/>
  <job_chain_node.end  state="End"/>
</job_chain>

チェーン内ではチェーン+ジョブの混在ができないようなので、nestチェーンにして、複数のチェーンを順次実行する形を取りました。

スケジュールの設定

config/live/test/exec_everyday_00oclock.schedule.xml
<schedule name="everyday_00oclock">
      <weekdays>
          <day day="1 2 3 4 5 6 7">
              <period  single_start="00:00" when_holiday="ignore_holiday"/>
          </day>
      </weekdays>
</schedule>
config/live/test/exec_everyday_12oclock.schedule.xml
<schedule name="everyday_12oclock">
      <weekdays>
          <day day="1 2 3 4 5 6 7">
              <period  single_start="12:00" when_holiday="ignore_holiday"/>
          </day>
      </weekdays>
</schedule>
  • 月~日
  • 祝日は考慮しない
  • 実行時刻は0時、12時

としています。

オーダーの設定

チェーンを実行するためのオーダー設定ファイルをチェーンのファイルと同じディレクトリに作成。

ファイル名は以下のフォーマット
チェーン名+","+オーダーID.order.xml

スケジュールを別定義にしたので、run_timeには時刻を記述せず。

config/live/test/jobchain/chain_mysql_pgsql,order01.order.xml
<order job_chain="/test/jobchain/chain_mysql_pgsql">
  <run_time />
</order>
config/live/test/jobchain/all_chain,order00.order.xml
<order job_chain="/test/jobchain/_all_chain">
  <run_time />
</order>

こんな感じで認識されます。

スケジュールとオーダーの紐付け

あとはオーダーを右クリックして、スケジュールと紐づけ。


先ほど設定したスケジュール定義のファイルを選択。

スケジュールタブで確認。