ジョブ管理システム

ジョブ管理システム

概要

ジョブ管理システムとは、複数のジョブ(プログラム、バッチ処理)の起動や終了を制御したり、ジョブの実行・終了状態の監視・報告などを行うソフトウェアである。「ジョブスケジューラ」、「タスクスケジューラ」とも呼ばれる。

なお、設定した時間にプログラムを起動するような単純なものを「タスクスケジューラ」と呼び、高度なもの(営業日や稼働日などの複数のカレンダーを持ち、複数のコンピュータ間の複雑なジョブ間の先行関係や例外処理を定義できるものなど)を「ジョブスケジューラ」と呼び分ける場合もある。比較的単純なものはオペレーティングシステムに標準装備されている場合も多い。

ジョブのスケジューリング

複数あるジョブそれぞれの起動契機をスケジュールする。たとえば、毎日何時何分にジョブ A を起動するとか、ジョブ B が正常終了したらジョブ C を起動する等とかいったことである。WindowsUNIXなどのOS標準機能でも簡単な曜日・時刻指定の起動ができるが、ジョブ管理ソフトウェアでは複数のカレンダー、複雑な先行関係、ファイルトリガー、外部トリガーなどが組み合わせられるものが多い。

ジョブの異常の報告

ジョブが実行時あるいは終了時に異常が発生した場合、メールやメッセージ等でオペレータに異常を報告する。

ジョブの実行状態のログを保存

ジョブが出力したメッセージやジョブの終了ステータス等をログに保存する。

crontab

crontabコマンドはUnixオペレーティングシステム (OS) において、コマンドの定時実行のスケジュール管理を行うために用いられるコマンドである。標準入力からコマンド列を読み取り、crontabと呼ばれるファイルにそれを記録する。この記録を元に定時になると、その命令内容を読み取り、実行が行われる。

一般にcrontabコマンドで編集されたスケジュール内容は、crondデーモンにより実行される。crondはバックグラウンドで稼動し、毎分ごとに実行すべきスケジュールがないか確認し、もし実行すべきジョブがあれば、それを実行する。

デーモン

デーモン (Daemon) は、UNIX, Linux, MacOSXなどUnix系のマルチタスクオペレーティングシステム (OS) において動作するプロセス(プログラム)で、主にバックグラウンドで動作するプロセス。ユーザが直接対話的に制御するプログラムもデーモンとして作ることができる。典型的なデーモンは名前の最後尾に "d" が付く。例えば、syslogd はシステムログを扱うデーモン、sshd は内外のSSH接続要求を受け付けるデーモンである。

Unix系の環境では、常にではないが、デーモンの親プロセスはinitプロセスとなっていることが多い。デーモンは起動処理内でforkで子プロセスを作成し、親プロセスの方が即座に終了するため、init が里親となる。さらにデーモンまたはOSは制御端末 (tty) からの切り離しなどの処理も行う必要がある。こういったデーモンを生成するための手続きをUnix系では daemonなどの便利なルーチンにまとめて実装していることが多い。

システムは、ブート処理の延長上でデーモンを多く起動する。ネットワークからの要求を処理するもの、ハードウェアの何らかの活動を処理するものなどがある。他にも、一部のLinuxシステムの udevd のようにハードウェアの設定を行うもの、cronのようにスケジュールされたタスクを実行するものなど、様々な処理を担っている。cronはデーモンプロセスの1種である。

init

initは、UNIXおよびUnix系システムのプログラムのひとつであり、他の全てのプロセスを起動する役目を持つ。デーモンとして動作し、一般にPID 1 を付与される。ブートローダカーネルを起動し、カーネルがinitを起動する。代替手段を用意せずにinitを削除すると、次回のリブート時にシステムはカーネルパニックに陥る可能性がある。

init の機能はBSD系とSystem V系では大きく異なるため、ユーザーは自分のシステムがどちらのバージョンを使っているかをマニュアルで調べる必要がある。多くのLinuxディストリビューションで使われていたinitはSystem Vと互換性がある。

ジョブキュー

ジョブキューとはジョブをキューで管理するものである。キューとはFIFO(First In First Out)を実現するデータ構造である。キューに登録されたモノは、キューに登録した順に処理される。ジョブキューにおいては、キューに登録するモノはジョブなので、キューに登録した順にジョブが処理されることになる。

ユーザから重たいジョブを処理するようにリクエストされたときに、ジョブを逐次的に処理せず、ジョブキューに登録することで「ジョブの受付をしました」とユーザにレスポンスを返すことができる。「リクエストを受け付ける=>リクエストを処理する=>レスポンスを返す」という従来の流れから「リクエストを受け付ける=>(とりあえず)レスポンスを返す=>リクエストを処理する」という流れを実現することができる。


f:id:wanwan_bowbow_ilovecat:20181026212901p:plain


ジョブキューでは、キューからジョブを取り出し順次処理を行うワーカーと呼ばれるプロセスが常駐することで、プロセス起動のコストを削減することができる。cronが起動するプロセスがライブラリなどを大量に読み込む必要がある場合、プロセス起動のコストは高い。そのような場合は、cronで都度プロセスを立ち上げるより、ジョブキューの常駐プロセス(ワーカー)を使う方が適切である。

同期処理と非同期処理

非同期処理は、あるタスクが実行をしている際に、他のタスクが別の処理を実行できる方式である。「ある関数が呼び出されたとき、戻り値として本来渡したい結果を返すのではなく、一度関数としては終了し(=呼び出し元に戻る)、後で『本来渡したかった値』を返せる状態になったときに、呼び出し元にその値を通知する」という処理を実現することができる。

同期処理では、あるタスクが実行している間、他のタスクの処理は中断される方式である。同期処理の場合は、時間がかかるタスクが存在する場合、そのプロセスが完了するまで他のプロセスも完了しません。これにより全体の効率(スループット)が低下する場合がある。

コールバック関数

非同期処理において、「ある特定の処理が終わったら、引数に渡した関数の処理を実行する」といったように処理のフローを制御する必要があるが、その際引数に渡される関数のことを「コールバック関数」という。


参考
ジョブ管理システム - Wikipedia
crontab - Wikipedia
デーモン (ソフトウェア) - Wikipedia
VOYAGE GROUP エンジニアブログ : 重たい処理を華麗にスルーして、アプリケーションの体感速度をぐっと向上させる方法