cron
を使ったタスク自動化のための簡単なbashスクリプトの作成
1. タスクの設定
今日は、サイトの可用性をチェックし、その結果をログファイルに記録し、cron
を使って自動で実行するリアルなスクリプトを書きます。
何を作りたいの?
以下のようなbashスクリプトを作ります:
ping
を使って指定されたサイトの可用性をチェックする。- 結果をログファイルに記録(時間と日付を含む)。
- このスクリプトを
cron
で5分おきに自動的に実行する。
なぜこれが重要なのか?
実際の世界では、ウェブサイトやサーバーの可用性を監視することはシステム管理者にとって重要なタスクの一つです。例えば、自分のサイト(またはサーバー)が突然応答しなくなった場合、それをできるだけ早く知りたいですよね。このようなシナリオは、監視だけでなく、面接や実務でも役に立ちます。
2. ステップ1: シンプルなbashスクリプトを書く
最初に基本のbashスクリプトを書いてみよう!以下にスクリプトが何をするのかを説明するよ:
- チェックするサイトのアドレスを指定する。
ping
を使ってサーバーへのリクエスト送信を試みる。- 利用可能な応答が返ってきたか確認する。
- 結果をログファイルに保存する。
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
コードの説明:
#!/bin/bash
— このスクリプトがBashを使って実行されるべきであることを示す。WEBSITE="example.com"
— チェックするサイトのアドレス。example.com
は、あなたがモニタリングしたい任意のサイトやサーバーに置き換えることができる。ping -c 1 $WEBSITE
— 指定されたサイトに1つのパケット(-c 1
)を送る。サイトが応答する場合、コマンドはコード0で終了。応答がない場合はエラー。&> /dev/null
— 標準出力とエラーを「ブラックホール」にリダイレクト(ping
の出力がコンソールに表示されないようにする)。$(date)
— メッセージに現在の日付と時刻を追加する。>> $LOG_FILE
— 結果をログファイルの最後に追加する。
3. ステップ2: スクリプトを手動で実行
スクリプトの実行を自動化する前に、きちんと動作するか確認しよう。
スクリプトをファイル
site_check.sh
に保存する。実行可能にする:
chmod +x site_check.sh
実行する:
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. よくある質問とエラーの解説
pingが「Permission denied」を返す
スクリプトを通常ユーザーとして実行している場合、権限が不足している可能性があります。
sudo
を使ってスクリプトを実行するか、実行権限を追加してください。ログファイルが作成されない
ログファイルのパス (
/var/log/site_status.log
) が正しく指定されていること、そしてあなたのユーザーがそのディレクトリに書き込み権限を持っていることを確認してください。ファイルが存在しない場合、以下を使用して手動で作成してください:sudo touch /var/log/site_status.log sudo chmod 666 /var/log/site_status.log
cron
がスクリプトを実行しないcron
サービスが動作しているか確認してください:sudo systemctl status cron
ステータスが
active (running)
である必要があります。停止している場合は、以下で起動してください:sudo systemctl start cron
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エンジニアやシステム管理者にとって非常に需要があります。
GO TO FULL VERSION