CodeGym /コース /Docker SELF /cronを使ったタスク自動化のための簡単なbashスクリプトの作成

cronを使ったタスク自動化のための簡単なbashスクリプトの作成

Docker SELF
レベル 3 , レッスン 6
使用可能

cronを使ったタスク自動化のための簡単なbashスクリプトの作成

1. タスクの設定

今日は、サイトの可用性をチェックし、その結果をログファイルに記録し、cronを使って自動で実行するリアルなスクリプトを書きます。

何を作りたいの?

以下のようなbashスクリプトを作ります:

  1. pingを使って指定されたサイトの可用性をチェックする。
  2. 結果をログファイルに記録(時間と日付を含む)。
  3. このスクリプトをcronで5分おきに自動的に実行する。

なぜこれが重要なのか?

実際の世界では、ウェブサイトやサーバーの可用性を監視することはシステム管理者にとって重要なタスクの一つです。例えば、自分のサイト(またはサーバー)が突然応答しなくなった場合、それをできるだけ早く知りたいですよね。このようなシナリオは、監視だけでなく、面接や実務でも役に立ちます。


2. ステップ1: シンプルなbashスクリプトを書く

最初に基本のbashスクリプトを書いてみよう!以下にスクリプトが何をするのかを説明するよ:

  1. チェックするサイトのアドレスを指定する。
  2. pingを使ってサーバーへのリクエスト送信を試みる。
  3. 利用可能な応答が返ってきたか確認する。
  4. 結果をログファイルに保存する。

site_check.shという名前のファイルを作成しよう:

#!/bin/bash

# ウェブサイトのアドレスを定義
WEBSITE="example.com"

# 結果を記録するためのログファイル
LOG_FILE="/var/log/site_status.log"

# pingを使用してサイトの利用可能性を確認
if ping -c 1 $WEBSITE &> /dev/null; then
    # サイトが利用可能な場合
    echo "$(date): $WEBSITE is reachable" >> $LOG_FILE
else
    # サイトが利用不可の場合
    echo "$(date): $WEBSITE is unreachable" >> $LOG_FILE
fi

コードの説明:

  1. #!/bin/bash — このスクリプトがBashを使って実行されるべきであることを示す。
  2. WEBSITE="example.com" — チェックするサイトのアドレス。example.comは、あなたがモニタリングしたい任意のサイトやサーバーに置き換えることができる。
  3. ping -c 1 $WEBSITE — 指定されたサイトに1つのパケット(-c 1)を送る。サイトが応答する場合、コマンドはコード0で終了。応答がない場合はエラー。
  4. &> /dev/null — 標準出力とエラーを「ブラックホール」にリダイレクト(pingの出力がコンソールに表示されないようにする)。
  5. $(date) — メッセージに現在の日付と時刻を追加する。
  6. >> $LOG_FILE — 結果をログファイルの最後に追加する。

3. ステップ2: スクリプトを手動で実行

スクリプトの実行を自動化する前に、きちんと動作するか確認しよう。

  1. スクリプトをファイルsite_check.shに保存する。

  2. 実行可能にする:

    chmod +x site_check.sh
    
  3. 実行する:

    sudo ./site_check.sh
    

スクリプト実行後、ファイル /var/log/site_status.log を開いて、チェック結果がログに追加されているか確認して。以下のコマンドを使う:

cat /var/log/site_status.log

すべてがうまくいけば、次のような行が出力に表示されるはず:

Mon Oct 30 14:35:22 UTC 2023: example.com is reachable

4. ステップ3: cronを使った自動実行の設定

もうcronがスケジュールに基づいてタスクを実行できることを知っているよね。これからcronを設定して、スクリプトを5分ごとに実行させるよ。

crontabの編集

crontabエディタを開いて:

crontab -e

次の行を追加してね:

*/5 * * * * /path/to/site_check.sh

説明:

  • */5 — タスクを5分ごとに実行することを指定。
  • /path/to/site_check.sh — このスクリプトの完全なパス。正しいことを確認してね。例えば、スクリプトがユーザーのホームディレクトリにある場合、パスは/home/your_username/site_check.shのようになる。

変更を保存した後、cronはスクリプトを5分ごとに実行し始めるよ。タスクが追加されたことを確認したい場合は、これを実行:

crontab -l

5. ステップ4: cronの動作確認

さて、自動化が動作しているか確認しよう。5〜10分待ってからログファイルをもう一度開いてみて:

cat /var/log/site_status.log

5分ごとに更新される新しい記録が見えるはずだよ。例えば:

Mon Oct 30 14:35:22 UTC 2023: example.comにアクセス可能
Mon Oct 30 14:40:22 UTC 2023: example.comにアクセス可能
Mon Oct 30 14:45:22 UTC 2023: example.comにアクセス可能

6. よくある質問とエラーの解説

  1. pingが「Permission denied」を返す

    スクリプトを通常ユーザーとして実行している場合、権限が不足している可能性があります。sudoを使ってスクリプトを実行するか、実行権限を追加してください。

  2. ログファイルが作成されない

    ログファイルのパス (/var/log/site_status.log) が正しく指定されていること、そしてあなたのユーザーがそのディレクトリに書き込み権限を持っていることを確認してください。ファイルが存在しない場合、以下を使用して手動で作成してください:

    sudo touch /var/log/site_status.log
    sudo chmod 666 /var/log/site_status.log
    
  3. cron がスクリプトを実行しない

    cron サービスが動作しているか確認してください:

    sudo systemctl status cron
    

    ステータスが active (running) である必要があります。停止している場合は、以下で起動してください:

    sudo systemctl start cron
    
  4. cronではスクリプトが実行されないが、手動では動く

    スクリプトおよび使用しているすべてのファイルのパスが完全に記述されていることを確認してください。cron タスクでは環境変数 (例えば $PATH) が異なる場合があります。絶対パスを使う方がいいです。


7. 改善と追加課題

ウェブサイトのフィルタリング

スクリプトを拡張して、複数のサイトの可用性をチェックできるようにしてみましょう。例えば:

WEBSITES=("example.com" "google.com" "stackoverflow.com")
for SITE in ${WEBSITES[@]}; do
    if ping -c 1 $SITE &> /dev/null; then
        echo "$(date): $SITE is reachable" >> $LOG_FILE
    else
        echo "$(date): $SITE is unreachable" >> $LOG_FILE
    fi
done

通知の送信

サイトが利用できない場合の通知送信を追加します。例えば、mailコマンドを使ってメールを送信する方法:

# メール通知
if ! ping -c 1 $WEBSITE &> /dev/null; then
    echo "$WEBSITE is down!" | mail -s "Website Check Alert" your_email@example.com
fi

循環ログ

ログファイルのサイズを例えば1MBに制限します。ファイルが大きくなりすぎた場合は、それをリネーム(アーカイブ)して新しいログを開始します。


おめでとう!これで、bashスクリプトとcronを使った実際のタスクの自動化について理解できました。このスキルは特にDevOpsエンジニアやシステム管理者にとって非常に需要があります。

1
Опрос
Linuxのサービス,  3 уровень,  6 лекция
недоступен
Linuxのサービス
Linuxのサービス
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION