シェルスクリプトで作るログ管理とメール通知機能付き簡単おみくじアプリ

## はじめに
今回は、シェルスクリプトを使って「おみくじアプリ」を作成する方法をご紹介します。

このスクリプトは、実行するたびにランダムにおみくじの結果を表示し、その結果をログファイルに記録する機能を持っています。

さらに、「大吉」が出た際にはメールで通知する機能も備えています。この記事では、スクリプトの作成手順から動作確認まで、詳しく解説します。

## 前提条件
今回の検証を進めるにあたり、以下の環境が必要です。

:::note info
**検証環境**
**Linuxディストリビューション:**
仮想環境や実際のサーバー上でLinux（ここではAlmaLinux 9.3を使用）が稼働していること。

**管理者権限を持つユーザーアカウント:**
sudo権限にてコマンド操作できること。

**メールサーバー構築済み：**

[こちらの記事で紹介：自宅のAlmaLinux 9.3でのメールサーバー構築およびメール送信の検証](https://qiita.com/free-honda/items/c10052dcd507ac7e7605)
:::

**自宅のVirtualBox環境**
今回も VirtualBox 上で構築した検証環境を使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/70df8950-ddfa-2728-1d71-60373a8276e9.png)

:::note info
※検証には実行中の「AlmaLinux」を使用します。
:::

## 知識整理
今回の検証で必要な知識を簡単に整理します。

**シェルスクリプト**
シェルスクリプトは、Linuxコマンドを自動的に実行するためのスクリプトです。

**$RANDOM**
シェル組み込みの乱数生成器を使い、その乱数を配列のインデックスに変換して結果を選びます。これにより、実行するたびに異なる結果がランダムに表示されます。

### ディレクトリ構成
まず、シェルスクリプトやログファイルを整理するためのディレクトリ構成を確認します。

以下のように設定することで、スクリプトやログファイルを管理しやすくなります。

```
/home/username/omikuji_app/
│
├── omikuji.sh        # メインのおみくじスクリプト
├── sendmail.sh       # 大吉の場合にメール通知を行うスクリプト
└── logs/             # ログを保管するディレクトリ
    └── omikuji.log   # 実行結果が出力されるログファイル
```

:::note warn
**ざっくりとしたシェルスクリプトの概要は、以下になります。**
**omikuji.sh：**
おみくじの結果をランダムに表示し、その結果をログファイルに記録します。

**sendmail.sh：**
おみくじの結果が「大吉」の場合、メールで通知を行います。

**logs/omikuji.log：**
おみくじの結果や、メール送信の履歴を記録するログファイルです。
:::

### フロー処理の流れ
おみくじスクリプトの処理フローは以下の通りです。

```omikuji.sh
+-----------------------------------------+
|   ログファイルのパスを設定               |
|   LOGFILE="/home/username/omikuji_app/"  |
|         "logs/omikuji.log"               |
+-----------------------------------------+
                      |
                      v
+-----------------------------------------+
|    おみくじ結果の配列を設定               |
|   results=("大吉" "中吉" "小吉" ... )      |
+-----------------------------------------+
                      |
                      v
+-----------------------------------------+
|    確率調整のために配列を拡張             |
|   expanded_results=("中吉" "小吉" ... )   |
+-----------------------------------------+
                      |
                      v
+-----------------------------------------+
|    ランダムでおみくじ結果を選択           |
|    result=${expanded_results[$RANDOM...]}|
+-----------------------------------------+
                      |
                      v
+-----------------------------------------+
|      結果を表示                          |
|      echo "今日の運勢: $result"           |
+-----------------------------------------+
                      |
                      v
+-----------------------------------------+
|    ログファイルに結果を書き込む           |
|    echo "$(date '+%Y-%m-%d %H:%M:%S')..."|
|    >> $LOGFILE                           |
+-----------------------------------------+
                      |
                      v
+-----------------------------------------+
|    結果が「大吉」なら、メール送信を実行   |
|    if [ "$result" == "大吉" ]; then      |
|    /home/username/omikuji_app/sendmail.sh|
+-----------------------------------------+
                      |
                      v
+-----------------------------------------+
|    メール送信のログを書き込む            |
|    echo "$(date '+%Y-%m-%d %H:%M:%S')..."|
|    >> $LOGFILE                           |
+-----------------------------------------+
```


## 検証の流れ
Linux環境でおみくじアプリの作成手順から動作確認する手順について、以下の2つのステップに分けて詳しく解説します。

**ステップ1：シェルスクリプトの作成**
**ステップ2：テストと動作確認**

::: note
※本記事は、すでに検証環境が構築されていることを前提としています。
:::

## ステップ1：シェルスクリプトの作成
まず、シェルスクリプト omikuji.sh を作成します。このスクリプトはランダムにおみくじの結果を生成し、その結果をログファイルに出力するものです。

```omikuji.sh
#!/bin/bash

# ログファイルのパス
LOGFILE="/home/username/omikuji_app/logs/omikuji.log"

# おみくじの結果を格納する配列
results=("大吉" "中吉" "小吉" "吉" "末吉" "凶" "大凶")

# 大吉の確率を下げるために、配列を増やす
expanded_results=("中吉" "小吉" "吉" "末吉" "凶" "大凶" "中吉" "吉" "大吉")

# ランダムにおみくじを引く
result=${expanded_results[$RANDOM % ${#expanded_results[@]}]}

# 結果を表示
echo "今日の運勢: $result"

# 日時を取得してログファイルに結果を書き込む
echo "$(date '+%Y-%m-%d %H:%M:%S') - 今日の運勢: $result" >> $LOGFILE

# 大吉が出た場合、sendmail.shを実行してメール通知を行う
if [ "$result" == "大吉" ]; then
    /home/username/omikuji_app/sendmail.sh
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 大吉が出たため、メール通知を送信しました。" >> $LOGFILE
fi
```

次に、「大吉」が出た場合にメール通知を行うための sendmail.sh を作成します。シンプルに mail コマンドを使い、メールを送信するスクリプトです。

```sendmail.sh
#!/bin/bash

# メール送信先のアドレス
MAIL_TO="admin@example.com"

# メール送信の処理（例: mailコマンド）
echo "大吉が出ました！" | mail -s "おみくじ結果" $MAIL_TO
```

:::note alert
**注意: シェルスクリプトの実行権限を忘れずに付与してください。** 以下のコマンドで実行権限を付与します。
```
chmod +x 作成したスクリプト名.sh
```
:::

## ステップ2：テストと動作確認
作成したスクリプトをテストします。以下のコマンドでスクリプトを実行し、正しく動作するか確認します。

```
./omikuji.sh
```

実行後、ログファイル logs/omikuji.log におみくじの結果が追記されていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/530ba9ea-ead5-e09f-8642-b71cc3eddf9d.png)


また、「大吉」が出た場合は、sendmail.sh が実行され、管理者にメールが送信されていることも確認します。

```logs/omikuji.log
[root@HONDA-TEST omikuji_app]# cat logs/omikuji.log
2024-09-24 21:57:00 - 今日の運勢: 中吉
2024-09-24 21:57:04 - 今日の運勢: 大凶
2024-09-24 21:57:05 - 今日の運勢: 中吉
2024-09-24 21:57:06 - 今日の運勢: 大凶
2024-09-24 21:57:07 - 今日の運勢: 吉
2024-09-24 21:57:08 - 今日の運勢: 中吉
2024-09-24 21:57:08 - 今日の運勢: 大吉
2024-09-24 21:57:15 - 大吉が出たため、メール通知を送信しました。
```

無事、私の個人メールにも「**おみくじ結果：大吉が出ました！**」というメッセージとともに届いていることが確認できましたので、自宅での検証は大成功ですね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/44d43a88-463b-4e1f-70d2-cd82d074b4bb.png)



## まとめ
今回作成したおみくじアプリでは、シェルスクリプトの基本的な構文を使って、ログの管理やメール通知機能を簡単に追加できることを学びました。

スクリプトを実行するたびに結果が記録され、特定の条件で通知を送信する仕組みは、運用管理やサーバーモニタリングにも応用できます。

## 参考記事
https://qiita.com/yoshige/items/1414bd736aec34ef3b24

https://www.seplus.jp/dokushuzemi/blog/2021/09/shellscript_practices.html