Hinemos: ジョブの基本的な作り方


###### 実施環境：

```Linux: Linux
[root@testhost ~]# uname -a
Linux testhost 4.18.0-338.el8.x86_64 #1 SMP Fri Aug 27 17:32:14 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
[root@testhost ~]# cat /etc/redhat-release
CentOS Stream release 8
[root@testhost ~]# yum list installed | grep hinemos
hinemos-7.0-agent.noarch                           7.0.1-1.el                                                 @@commandline
hinemos-7.0-manager.x86_64                         7.0.1-1.el8                                                @@commandline
hinemos-7.0-web.x86_64                             7.0.1-1.el8                                                @@commandline
```

### 0. 概要

業務というものは、大抵の場合複数の処理に分解することができます。
例えば「ある通販サイトの商品の売れ行きの集計をメールで受け取る」という業務があった場合、「データの集計」「 PDF ファイルに変換」「メールで送信」のような処理に分けられたりするかもしれません。

このような業務をプログラム化する際、大抵は、すべての処理を1つのプログラムに入れたりせず、処理単位で別々のプログラムを作成し、それらを順番に実行するという形になります。
簡単な業務であれば手動でこれらを行う場合もあるでしょうが、処理の結果によって次の処理を変えるような複雑な業務や、何百、何千もの処理からなる巨大な業務、毎日決まった時間に行うような定期的な業務となると、手動で行うのは大変ですし、なによりミスのもとです。

このような場面で利用されるのが「ジョブ管理システム」です。
「ジョブ」はユーザがコンピュータに依頼する仕事の単位で、1つまたは複数のプログラムからなります。
このジョブを制御するのがジョブ管理システムで、ジョブを一定間隔で起動したり、ジョブの動作状況を監視したりすることができます。

「 Hinemos 」はこのジョブ管理システムとしての機能を持つソフトウェアの1つです。
今回はこの Hinemos における、ジョブの基本的な作り方を紹介します。

なお、今回、 Hinemos 自体のインストールやマネージャとエージェントの紐づけなどは既に済んでいるものとして扱います。
その部分について知りたい場合は、以下の過去記事をご参照ください。

https://qiita.com/frozencatpisces/items/36e782f9e551d2763b67

### 1. ジョブの作成

まずは、簡単なジョブを1つ作ってみましょう。

#### 1.1. ジョブユニットの作成

ジョブの編集は「パースペクティブ」⇒「ジョブ設定」から行います。

![WS000091.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/cdb4b073-cc87-95ef-52a1-a1bd456ceb87.jpeg "jobunit_1")

さて、Hinemos のジョブは階層構造の上位から、「ジョブユニット」「ジョブネット」「ジョブ」の3層構造となっています。
簡単に言うと、ジョブユニットはジョブをまとめるフォルダのようなもので、ジョブが個々の処理、複数のジョブを1つのセットにしたものがジョブネットとなります。

まずは最上位のジョブユニットを作成しましょう。
「マネージャ(マネージャ1)」を選択し、「ジョブユニットの作成」ボタンを押します。

![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/800a4c6a-8c07-9414-8b4a-b528afc9b90d.jpeg "jobunit_2")

今回は、ジョブ ID に「 `job_unit_01` 」、ジョブ名に「 ジョブユニット_01 」とします。
それ以外の設定はすべてデフォルトでよいです。
入力したら「 OK 」を押します。

![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/7fb3f4cb-f353-ea9d-bdde-10eb7b849b94.jpeg "jobunit_3")

これでジョブユニットが作成されます。

![WS000095.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/7607f3e3-1b52-7b0c-d92b-4376a96221ca.jpeg "jobunit_4")

#### 1.2. ジョブネットの作成

作成されたジョブユニットは、編集モードになっています。
「ジョブネットの作成」ボタンを押してジョブネットを作成しましょう。

![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/1853ed74-a633-c849-a9f5-166840b2ca6e.jpeg "jobnet_1")

今回はジョブネットのジョブ ID は「 `jobnet_01_01` 」、ジョブ名は「 ジョブネット_01_01 」にしましょう。
それ以外の設定はすべてデフォルトで「 OK 」を押します。

![WS000004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/6ae39455-286a-03bf-9827-7b2b41c8aa54.jpeg "jobnet_2")

これでジョブネットも作成できました。

![WS000005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/6f006892-aaba-60d1-3834-1875719ad652.jpeg "jobnet_3")

#### 1.3. ジョブの作成

最後に、「コマンドジョブの作成」ボタンを押してジョブを作成します。

![WS000005 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/508f029d-94d1-cd5c-9bc6-42f7fc11640d.jpeg "job_1")

今回、ジョブ ID は「 `job_01_01_01` 」、ジョブ名は「 ジョブ_01_01_01 」にしました。
さらに「コマンド」タブを選択し、起動コマンドに以下のコマンドラインを指定します。

```Linux: 起動コマンド
date >> /tmp/test_01.log
```

![WS000006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/22784ff6-5600-7423-8339-9254929fa32e.jpeg "job_2")

次にコマンドを実行するサーバを指定するため、スコープで「固定値」を選択して、その右の「参照」ボタンを押します。

![WS000006 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/dad2c0fd-a44e-9dee-49a9-128ab94537aa.jpeg "job_3")

登録してあるスコープを選択して、「 OK 」を押します。

![WS000007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/ba12ff0a-7982-a41f-e8b9-8f16fa15268f.jpeg "job_4")

他の項目はデフォルトのままでよいですので、「 OK 」を押します。

![WS000008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/2eb44ca6-0409-0ff6-b0a4-4cfe8346bf26.jpeg  "job_5")

これで、ジョブも作成できました。

![WS000009.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/1d4a8939-e738-a013-5869-e394915de75a.jpeg "job_6")

#### 1.4. 編集モードの終了

これで設定は以上ですので、「登録」ボタンを押します。
ボタンを押すことで、ここまでの変更が確定します。

![WS000009 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/b459dd81-636e-da83-a0e8-536474fdbd3e.jpeg "save_1")

確認メッセージが出るので、「 Yes 」を押します。

![WS000010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/4ada82c9-c747-3465-a812-6a64b3429314.jpeg "save_2")

以下のようなメッセージが表示されれば成功です。

![WS000011.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/10a6928e-491c-c38d-270b-6f4dc405cb2d.jpeg "save_3")

「編集モード」の文言が消えているのがわかると思います。

![WS000012.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/15fb8a7d-1517-ed3a-db12-e47daadb44b3.jpeg "save_4")

### 2. ジョブの実行

作成したジョブを、実行してみましょう。

#### 2.1. ジョブの実行

ジョブを手動で実行するには、「実行」ボタンを押します。

![WS000012 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/efeea036-e629-af85-1f2b-8f1ff4833760.jpeg "exec_1")

確認メッセージが出るので、「実行」を押します。

![WS000013.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/7505dc88-66a7-25cd-c682-992dd61b7b07.jpeg "exec_2")

これで、ジョブが実行できました。

なお、上の例ではジョブを単体で実行しておりますが、ジョブの構成によっては上位のジョブネットを選択して実行しなくてはならない場合もあります。

#### 2.2. ジョブの実行結果

ジョブの実行結果は、ジョブの編集画面とは別の画面から確認します。
「パースペクティブ」⇒「ジョブ履歴」を選択してください。

![WS000092.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/41737451-c1a6-2691-f835-3164b9fc78b7.jpeg "check_1")

すると、ジョブの履歴画面が表示されます。

![WS000093.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/c0ef02ee-2fee-29be-28cc-b1500d1d26b0.jpeg "check_2")

正しく設定が行われていれば、先ほど手動で実行したジョブについて、「実行状態」が「終了」、終了状態が「正常」になっているはずです。

![WS000014.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/0649d1dc-5f5b-ab82-419d-5a8102c7918a.jpeg "check_3")

 OS 側から見ても、きちんと動作できていることがわかります。

```Linux: Linux
[root@testhost ~]# ls -l /tmp/test_01.log
-rw-r--r-- 1 root root 43  2月  4 13:22 /tmp/test_01.log
[root@testhost ~]# cat /tmp/test_01.log
2024年  2月  4日 日曜日 13:22:45 JST
[root@testhost ~]#
```

### 3. 順序性を持ったジョブ

次に、ジョブをもう1つ作って、先ほど作ったジョブの後に実行されるようにしてみましょう。

#### 3.1. 2番目に起動するジョブの作成

まずは、先ほど作成したジョブユニットを選択して、「編集モード」を押します。

![WS000015.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/21cb9c01-1aec-be98-526a-453ca8a724d8.jpeg "second_1")

ジョブネットを選択して、「コマンドジョブの作成」ボタンを押します。

![WS000018.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/219971c0-3403-1b44-f357-51cecd53e31a.jpeg "second_2")

ジョブ ID は「 `job_01_01_02` 」、ジョブ名は「 ジョブ_01_01_02 」にし、起動コマンドには以下のコマンドラインを指定します。
それ以外は先ほどのジョブと同じ設定でよいです。
設定できたら「 OK 」を押します。

```Linux: 起動コマンド
mv /tmp/test_01.log /tmp/test_02.log
```

![WS000019.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/08a15a77-17dd-9e98-f787-5282239aa981.jpeg "second_3")

さて、ジョブの順序性ですが、「待ち条件」タブから編集します。
ここで例えば「あるジョブが正常終了」「特定の時刻に到達」などの条件を組み合わせて、ジョブが起動するための条件を作成します。
まずは「追加」を押して条件を1つ追加しましょう。

![WS000021.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/24f2f447-0f96-b26c-c440-d162eafc6c12.jpeg "second_4")

条件の編集画面は以下のようになっています。
「追加」を押して、新しいルールを1つ追加します。

![WS000022.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/7271186e-e0bb-a461-f9a1-f35e528fa4f2.jpeg "second_5")

新しいルールが1つ追加されました。
ここからこのルールを編集していきます。

![WS000023.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/89ed005e-0106-558d-d1fd-1f20a8e480ed.jpeg "second_6")

ルールの種類について、今回は 1 で作ったジョブ「 ジョブ_01_01_01 」の後にこのジョブ「 ジョブ_01_01_02 」を動かしたいので、「ジョブ(終了状態)」を選択します。

![WS000096.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/db46b437-2cc5-32d9-4bd1-e01ca2b63fd8.jpeg "second_7")

これを開くと、以下のように編集できる項目が表示されます。

![WS000024.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/fdd0839e-bd92-fef8-a6c6-4055ffd1c0de.jpeg "second_8")

まずは、ジョブ ID に 1 で作ったジョブ「 ジョブ_01_01_01 」を指定します。

![WS000025.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/dd66e29e-5381-d778-0b08-2628c86afb8c.jpeg "second_9")

![WS000026.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/ffae5f6c-c641-1d9d-fb32-3f869d98ae58.jpeg "second_10")

![WS000097.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/ff2c36ae-1a7a-039a-adfe-6c3c3f660185.jpeg "second_11")

次に、値に「正常」を指定します。

![WS000028.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/af357b75-0b44-ecda-2e10-8e452f63e90c.jpeg "second_12")

![WS000029.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/f3e3f7a2-5c83-6068-6e62-53a71760781f.jpeg "second_13")

最後に「 OK 」を押して、設定を終了します。

![WS000029.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/602d2c35-e785-38b4-ae2e-6d6c33248a06.jpeg "second_14")

![WS000030.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/d7062ae5-c865-4706-8253-063c4dbd34ef.jpeg "second_15")

これで、 1 で作ったジョブ「 ジョブ_01_01_01 」が正常に完了した場合に、今回作ったジョブ「 ジョブ_01_01_02 」が起動するように設定できました。

#### 3.2. 実行確認

実際にジョブを動かして確認してみましょう。
なお、今回は下位のジョブではなく、上位のジョブネット「 ジョブネットテスト_01_01 」から実行します。
下位のジョブ「 ジョブ_01_01_01 」や「 ジョブ_01_01_02 」から起動しても、各ジョブが単体で実行されるだけで順序性の確認はできないので注意してください。

![WS000034.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/1a704b55-88f2-781a-a892-5813801501bf.jpeg "check_2_1")

![WS000035.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/3a7b5d34-a6a5-11fd-12e8-7b0d8aca6851.jpeg "check_2_2")

ジョブが順番に動作しました。
 OS 側から見ても、きちんと順番に動作できていることがわかります。

```Linux: Linux
[root@testhost ~]# ls -l /tmp/test_*
-rw-r--r-- 1 root root 86  2月  4 13:35 /tmp/test_02.log
[root@testhost ~]# cat /tmp/test_02.log
2024年  2月  4日 日曜日 13:22:45 JST
2024年  2月  4日 日曜日 13:35:43 JST
[root@testhost ~]#
```

### 4. 定期的に起動するジョブ

ここまでジョブを手動で起動してきましたが、実際のところジョブは、毎日何時や毎時何分など、定期的に起動させたいことの方が多いです。
今回は先ほど作ったジョブについて、毎時 00 分で起動するようにしてみましょう。

#### 4.1. スケジュールの作成

スケジュールはジョブの設定として作成するのではなく、ジョブとは別の「スケジュール」として作成し、それをジョブに適用するという形をとります。
そのため設定場所も「ジョブ設定[一覧]」ではなく、その下の「ジョブ設定[実行契機]」となります。

![WS000094.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/e2cecc3c-7fbd-2972-8fc7-5961c76685a7.jpeg "schedule_1")

「スケジュール作成」を押し、新しいスケジュールを作成します。

![WS000089.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/5196a307-e910-8bb3-79c3-86d38250eda4.jpeg "schedule_2")

![WS000041.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/19a5b079-39f5-0cb5-7726-fefa9f8eaae2.jpeg "schedule_3")

まずはスケジュール名を決めましょう。
今回は「実行契機 ID 」に「 `schedule_01` 」、「実行契機名」に「 スケジュール_01 」と入力します。

![WS000042.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/6d198f0d-f323-33b6-d397-3e0de532db27.jpeg "schedule_4")

次にジョブについて、先ほど作ったジョブ「 ジョブネット_01_01 」を指定します。

![WS000098.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/3cfeedc1-1154-8f4e-6d47-677997461ab2.jpeg "schedule_5")

![WS000043.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/15eb7cd3-3c12-868f-6258-d51f91a9619f.jpeg "schedule_6")

![WS000099.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/1d25787b-fa6a-ba0b-ca14-ad84e2b8e38a.jpeg "schedule_7")


そしていよいよスケジュール設定です。
「スケジュール設定」タブから設定します。
今回は毎時 00 分に起動させたいので、「毎時」「 00 分から」「 60 分ごと」に設定します。

![WS000044 - コピー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/c7b4aeb0-43bc-c018-36fd-1ad357b28af4.jpeg "schedule_8")

「登録」ボタンを押して登録します。
「登録成功」と出れば OK です。

![WS000100.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/66b7264d-091b-b6a0-9b59-2ae6a8d01147.jpeg "schedule_9")

![WS000045.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/e41733c7-0da0-28fe-4cc4-63a187fd9424.jpeg "schedule_10")

![WS000046.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/4c901861-efa2-c4ad-ba2f-966f8a4f30c3.jpeg "schedule_11")

#### 4.2. 実行確認

実際に 00 分まで待って、ジョブが実行されるのを確認してみます。

![WS000047.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/6dd0d470-1737-4e9a-a810-b427d9ccab55.jpeg "check_3_1")

 00 分にジョブが実行されました。
 OS 側から見ても、きちんとスケジュール通りに実行されていることがわかります。

```Linux: Linux
[root@testhost ~]# ls -l /tmp/test_*
-rw-r--r-- 1 root root 43  2月  4 14:00 /tmp/test_02.log
[root@testhost ~]# cat /tmp/test_02.log
2024年  2月  4日 日曜日 14:00:01 JST
[root@testhost ~]#
```

### 5. インポート・エクスポートに関する注意点

 Hinemos のジョブは、「インポート」「エクスポート」ボタンを押すことでインポート、エクスポートできます。

![WS000048.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/b3335c81-de86-5276-358b-55667ec18d76.jpeg "import_1")

ただし、この機能が利用できるのはエンタープライズ版のみです。
 OSS 版では利用できないので注意してください。

![WS000049.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/accfa638-5c83-1b4c-1492-6def1c7853da.jpeg "import_2")