【Linux】bashで自動化スクリプトを書くときに使えるコマンド集|システム運用担当者向けまとめ

Linux

どーも!marusukeです!

システム運用の現場では、同じ作業を何度も手でやるより「bashスクリプトに落として自動化する」場面がたくさんあります。この記事では、私自身が自動化スクリプトを書くときによく使っているコマンドを目的別にまとめました。

それぞれのコマンドの詳しいオプションや使用例は、コマンド名から個別記事にリンクしていますので、気になるものがあればそちらもご覧ください。この記事はいわば「自動化コマンドの目次」です。

この記事の使い方

  • スクリプトを安全に書くための基本
  • 定期実行のコマンド
  • 重複実行を防ぐコマンド
  • ファイル操作・一括処理のコマンド
  • ログ・通知のコマンド
  • リモート操作・バックアップのコマンド
  • 条件分岐・後片付けのコマンド
  • 組み合わせ例(夜間バックアップスクリプト)

スクリプトを安全に書くための基本

自動化スクリプトの先頭に書いておくと事故を防げる設定です。

set -euo pipefail-eはコマンドが失敗した時点でスクリプトを止め、-uは未定義の変数を使おうとするとエラーにし、-o pipefailはパイプの途中のコマンドが失敗した場合もパイプ全体を失敗扱いにします。自動化スクリプトは人が張り付いて見ているわけではないので、「途中でコケたのに最後まで何事もなく走ってしまう」事故をこの1行で防げます。詳しい解説と事故例は個別記事をどうぞ。

#!/bin/bash
set -euo pipefail

trapコマンド ― スクリプトが終了するタイミングやエラー発生時に、決まった処理(一時ファイルの削除やロックの解放など)を実行させられます。詳しい使い方は個別記事をどうぞ。

ファイルディスクリプタとは?flockexecを使ったロック処理を理解するための前提知識です。標準入出力(0/1/2)の先、execで自分で開く4番以降のFDについて解説しています。

定期実行のコマンド

作ったスクリプトを「決まった時間に自動で動かす」ためのコマンドです。

crontabコマンド ― 「分 時 日 月 曜日 コマンド」の形式で、繰り返しの定期実行を設定する定番コマンドです。

atコマンドcrontabが繰り返しの実行なのに対して、atは「今日の22時に1回だけ」のような単発の予約実行に向いています。 WSL2でも試せますが、本番の「24時間365日動かし続ける自動化」にはVPSが必要です。ここまでのコマンドはWSL2上でもそのまま動きます。ただしWSL2は、PCの電源を切ったりスリープさせたりすると一緒に止まってしまうため、「毎日決まった時間に必ず動く」自動化を本番運用するのには向きません。24時間稼働のサーバーで運用したい場合は、VPSなど常時起動の環境を用意する必要があります。学習環境としてWSL2とVPSのどちらを使うべきかはこちらの記事で整理していますので、あわせてご覧ください。

重複実行を防ぐコマンド

cronで定期実行していると、「前回の処理がまだ終わっていないのに、次の実行が始まってしまう」という事故が起こります。

flockコマンド ― ファイルロックの仕組みを使って、同じ処理の多重起動・重複実行を防ぎます。cronに登録する自動化スクリプトとはセットで覚えておきたいコマンドです。

ファイル操作・一括処理のコマンド

自動化スクリプトの本体でよく使う、ファイルを探して処理するコマンドです。

findコマンドxargsコマンド ― 条件に合うファイルを探し出し、まとめて別のコマンドに渡して処理します。「30日より前のログファイルをまとめて削除する」といった定番の掃除スクリプトによく使われる組み合わせです。

awkコマンド ― ログの特定の列を取り出して集計するのに向いています。アクセスの多いIPアドレスの検知など、監視スクリプトでも活躍します。

sedコマンド ― 設定ファイルの一括書き換えに使います。-iオプションでファイルを直接編集できます。

ログ・通知のコマンド

自動化スクリプトは「動いたかどうか」を後から確認できるようにしておくことが重要です。

dateコマンド ― ログファイル名にタイムスタンプをつけるのに使います。実行のたびにファイル名を変えることで、過去の実行結果を上書きせず残せます。

teeコマンド ― 標準出力・標準エラー出力を画面に表示しつつ、同じ内容をログファイルにも追記します。

logger(記事準備中) ― 自作のログファイルではなく、システムのsyslog(journalctlなど)に記録したい場合に使うコマンドです。個別記事は準備中です。

grepコマンドgrep -qは結果を画面に出さず、見つかったかどうかを終了コードだけで返します。「ログにエラー文字列があれば通知する」という自動化の定番パターンに使えます。

mail/curl(Webhook通知)grep -qなどで異常を検知したら、mailコマンドでメール通知したり、SlackなどのWebhook URLへcurlでPOSTしてチャット通知したりできます。どちらも自動化スクリプトの「異常時に人に知らせる」部分でよく組み合わせて使います。

リモート操作・バックアップのコマンド

複数サーバーをまたいだ自動化でよく使うコマンドです。

rsyncコマンド ― 差分だけを転送するバックアップ・同期コマンドです。ローカル・リモートどちらにも使えます。

sshコマンド ― 鍵認証を設定しておけば、パスワード入力なしでリモートサーバー上のコマンドを自動実行できます。

scpコマンド ― 1つのファイルだけをサッと転送したいときに使います。ディレクトリ全体の同期にはrsyncの方が向いています。

条件分岐・後片付けのコマンド

自動化スクリプトを「安全に終わらせる」部分でよく使うコマンドです。

testコマンド([ ] ― ファイルの存在確認や文字列・数値の比較に使います。想定外の状態を早めにexitで止めておくことで、途中の処理が中途半端なまま進んでしまう事故を防げます。

mktemp(記事準備中) ― 安全な一時ファイル・一時ディレクトリを作成するコマンドです。個別記事は準備中です。trapコマンドと組み合わせて、スクリプト終了時に必ず削除するのが定番の書き方です。

組み合わせ例:夜間バックアップスクリプト

ここまでのコマンドを組み合わせた、実際に動く自動化スクリプトの例です。

#!/bin/bash
set -euo pipefail

LOGFILE="/var/log/backup/backup_$(date '+%Y%m%d_%H%M%S').log"
LOCKFILE="/tmp/backup.lock"

exec 200>"$LOCKFILE"
flock -n 200 || { echo "前回の処理が実行中のため終了します" | tee -a "$LOGFILE"; exit 1; }

trap 'logger -t backup_script "異常終了しました(行番号: $LINENO)"' ERR

logger -t backup_script "バックアップ処理を開始します"

{
  rsync -avz --delete /home/ope/data/ ope@backup-server:/backup/data/
} 2>&1 | tee -a "$LOGFILE"

find /var/log/backup -name "backup_*.log" -mtime +30 -print0 | xargs -0 -r rm -f

if grep -q "rsync error" "$LOGFILE"; then
  curl -X POST -H 'Content-type: application/json' \
    --data '{"text":"夜間バックアップでエラーが発生しました"}' \
    "$SLACK_WEBHOOK_URL"
  exit 1
fi

logger -t backup_script "バックアップ処理が正常に終了しました"

crontabにはこの1行を登録すればOKです。

0 3 * * * /home/ope/scripts/nightly_backup.sh

set -euo pipefailで事故を防ぎ、flockで多重起動を防ぎ、trapで異常終了時にログを残し、rsyncで差分バックアップを取り、findxargsで古いログを掃除し、grep -qcurlで異常があれば通知する――今回まとめたコマンドを一通り組み合わせると、こういった実用的な自動化スクリプトになります。

あわせて読みたい

まとめ

システム運用担当がbashで自動化スクリプトを書くときによく使うコマンドを、目的別にまとめました。

  • 安全に書くための基本:set -euo pipefailtrap
  • 定期実行:crontabat
  • 重複実行防止:flock
  • ファイル一括処理:findxargsawksed
  • ログ・通知:dateteeloggergrep -qmailcurl
  • リモート操作:rsyncsshscp
  • 条件分岐・後片付け:testmktemp

それぞれのコマンドの詳しい使い方は個別記事にまとめていますので、気になったものから読んでみてください。

以上です! ここまで読んでいただきありがとうございました!

コメント

タイトルとURLをコピーしました