シェルスクリプト
シェルスクリプト:記事リスト
シェルスクリプトのカテゴリーには以下の記事がリストされています。
シェルスクリプトのリファクタリング設計|if地獄・グローバル変数汚染・コピペ地獄を関数とローカル変数で直す実践パターン
「ちょっとした修正を加えるたびに別の箇所が壊れる」
「コードをコピペしまくって、同じバグを10箇所直さないといけない」
こういう経験は、Linuxサーバーをある程度触ったことのあるエンジニアなら一度は必ず通る道です。シェルスクリプトは手軽に始められる分、設計を意識しないとあっという間に「読めないコード」になります。
この記事では、現場で実際によく見かける「if地獄」「グローバル変数汚染」「コピペ地獄」の3つのアンチパターンを取り上げ、それぞれを関数・ローカル変数・共通ライブラリで改善するリファクタリング設計を解説します。RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みです。
この記事のポイント
・if地獄はearly return(早期終了)パターンとガード節で解消できる
・local宣言で変数スコープを関数内に閉じてグローバル汚染を防ぐ
・共通処理はsourceで外部ライブラリ化して複数スクリプトで再利用する
・リファクタリングはshellcheckで問題を可視化してから段階的に進める
続きを読む "シェルスクリプトのリファクタリング設計|if地獄・グローバル変数汚染・コピペ地獄を関数とローカル変数で直す実践パターン"
シェルスクリプトでプロセスを監視して自動再起動する方法|kill -0チェックとwatchdog設計の実践
バッチ処理や自前デーモンが途中でクラッシュしても、systemdのRestartが使えないケースでは誰も検知できません。
この記事では、シェルスクリプトで
kill -0 を使いプロセスの死活を確認し、停止時に自動再起動するwatchdog設計の実践手順を解説します。再起動回数の上限管理、メールアラート通知、cronでの定期実行と二重起動防止を組み合わせた堅牢な実装パターンを、実機ログを交えて紹介します。
この記事のポイント
・kill -0 $PID でプロセスの存在を確認し、停止時に自動再起動できる
・再起動回数をファイルで上限管理し、連続失敗時はアラートを送って自動収束させる
・cron実行時はflock -n でwatchdog自身の二重起動を防ぐ設計が必須
・systemd Restart設定で代替できる場合は必ずそちらを優先する
続きを読む "シェルスクリプトでプロセスを監視して自動再起動する方法|kill -0チェックとwatchdog設計の実践"
シェルスクリプトの入力バリデーション設計|型・形式チェック関数をライブラリ化して複数スクリプトで再利用する方法
シェルスクリプトは手軽に書けるがゆえに、入力バリデーションを後回しにしたまま本番運用に持ち込まれるケースが多い。引数が空でも処理が進み、想定外のファイルが削除されるまで問題に気づかないのは、バリデーションが設計に組み込まれていないからだ。
この記事では、シェルスクリプトにおける引数・環境変数・ファイルパスの型・形式・範囲チェックを、再利用可能な関数群としてライブラリ化する設計パターンを解説する。RHEL 9.4 / Rocky Linux 9.4 / Ubuntu 24.04 LTS で動作確認済みの実装例を示す。
この記事のポイント
・バリデーション不在のスクリプトは引数ミスで本番データを破壊するリスクがある
・整数チェックは [[ $val =~ ^[0-9]+$ ]] の1行で実装できる
・チェック関数を lib/validate.sh にまとめると複数スクリプトで source 再利用できる
・usage 関数と exit 1 をセットにしてスクリプト自身が使い方を提示する設計が鉄則
続きを読む "シェルスクリプトの入力バリデーション設計|型・形式チェック関数をライブラリ化して複数スクリプトで再利用する方法"
シェルスクリプトのshoptコマンドでbash動作を設計する方法|globstar・nullglob・nocasematchの実践活用
「サブディレクトリも含めてファイルを一括処理したいのに、findとループの組み合わせが長くなりすぎる」
「case文でユーザー入力の大文字小文字の揺れに毎回対応しなければならない」
こうした問題は、bashの動作フラグを一行変えるだけで解決できます。
shopt(shell options)コマンドを使うと、globのパターン展開・ゼロヒット時の挙動・文字列比較のルールをスクリプト単位で切り替えられます。コマンドを1つ覚えるだけで、堅牢さが大きく変わります。この記事では、シェルスクリプトの設計に直結するshoptオプションを解説します。globstar(
**でサブディレクトリを再帰)・nullglob(ゼロヒット時に空配列)・nocasematch(大文字小文字を吸収)を中心に、Rocky Linux 9.4 / Ubuntu 24.04 LTSで動作確認した実例で紹介します。この記事のポイント
・shopt -s で有効化、shopt -u で無効化。設定はスクリプト内でのみ有効
・globstar を有効にすると ** でサブディレクトリを再帰処理でき、findの代替になる
・nullglob を有効にするとマッチなし時に空配列になり、globループの誤動作を防げる
・nocasematch を有効にするとcase文・[[ ]]が大文字小文字を区別しなくなる
続きを読む "シェルスクリプトのshoptコマンドでbash動作を設計する方法|globstar・nullglob・nocasematchの実践活用"
シェルスクリプトでgpg暗号化バックアップを自動化する設計|無人実行・エラー処理・復号テストの実装パターン
こうした不安を感じながら、バックアップファイルを平文のまま保管しているケースは少なくありません。
バックアップの目的はデータを守ることですが、保管場所のセキュリティが不十分だと、バックアップファイル自体が漏洩経路になります。gpgで暗号化しておけば、万が一ファイルが流出しても鍵なしでは内容を読めません。
この記事では、gpgとシェルスクリプトを組み合わせて暗号化バックアップをcronで無人自動実行する設計を解説します。trapによるエラー処理と後始末、復号テストによる整合性検証まで、本番環境で使える実装パターンを紹介します。
この記事のポイント
・gpg --symmetric でパスフレーズを使った対称暗号化バックアップを無人実行できる
・--passphrase-file でパスフレーズをファイルから安全に渡し、cron環境でも動作する
・trap cleanup EXIT で一時ファイルを確実に後始末するcleanup設計が必須
・暗号化後に gpg --decrypt | tar tz で整合性を検証し、破損を即座に検知する
続きを読む "シェルスクリプトでgpg暗号化バックアップを自動化する設計|無人実行・エラー処理・復号テストの実装パターン"
シェルスクリプトでメンテナンスウィンドウを実装する設計|時刻・曜日チェックで作業時間外の実行を制御する方法
定期実行スクリプトに「メンテナンスウィンドウ(許可時間帯)」を組み込むことで、許可された時間帯だけ処理を実行し、それ以外はスキップするように制御できます。dateコマンドで現在の時刻・曜日を取得し、条件分岐でウィンドウ外を検知する仕組みは、数十行のシェルスクリプトで実装できます。
この記事では、bashのdateコマンドを使った時刻・曜日チェックの実装パターンを、RHEL 9 / Rocky Linux 9 で動作確認した実際のスクリプト例を交えながら解説します。
この記事のポイント
・dateコマンドの書式指定で現在時刻・曜日番号を数値として取得できる
・時刻チェックは「開始時刻 <= 現在時刻 < 終了時刻」の整数比較で実装する
・日付跨ぎ(23:00~翌1:00)は時刻をHHMM形式の整数に変換して正しく判定する
・曜日・時刻・ホスト名の複合条件で本番環境の運用ルールをコードに落とし込める
続きを読む "シェルスクリプトでメンテナンスウィンドウを実装する設計|時刻・曜日チェックで作業時間外の実行を制御する方法"
シェルスクリプトでSFTPファイル転送を自動化する設計|バッチモードとSSH鍵認証で安全な自動転送を実装する方法
パスワードを打ち込んでログインして、ファイルをputして、接続を閉じる。1回2分の作業でも、1日10回やれば20分の消費だ。cronで深夜に自動実行したくても、パスワード入力が必要では実現できない。
この記事では、SSH鍵認証とSFTPのバッチモードを組み合わせて、シェルスクリプトからSFTPファイル転送を完全自動化する設計を解説する。アップロード・ダウンロードの実装パターンから、エラー検知の落とし穴、ログ設計、cronとの組み合わせまで実践コード付きで紹介する。動作確認環境はRHEL 9.4 / Ubuntu 24.04 LTS。
この記事のポイント
・SSH鍵認証でパスワード不要のSFTP自動接続を確立できる
・sftp -b でバッチファイルを渡せばput/getを無人実行できる
・sftpはファイル未存在でもexit 0を返すので戻り値だけに頼らない設計が必要
・ログとcronを組み合わせれば深夜の定期転送が実現できる
続きを読む "シェルスクリプトでSFTPファイル転送を自動化する設計|バッチモードとSSH鍵認証で安全な自動転送を実装する方法"
Gitリポジトリをシェルスクリプトから操作する設計|自動pull・差分検知・タグ付与を安全に実装する方法
「cronで定期的にGitリポジトリを自動更新したいが、SSH鍵が読めなくてgitコマンドが失敗する」
こういった悩みは、自動化の仕組みを作り始めた頃に必ずぶつかる壁です。原因は、シェルスクリプトが動く環境(cronやsystemdのサービス)はログインシェルと全く別物であり、
SSH_AUTH_SOCKやPATHなどの環境変数が一切引き継がれないことにあります。この記事では、シェルスクリプトからGitリポジトリを安全に操作するための設計パターンを解説します。SSH認証の環境変数設定、
git status --porcelainによる機械可読な差分検知、git pull時の競合回避設計、デプロイ完了をバージョンタグで記録する方法まで、RHEL 9.4 / Ubuntu 24.04 LTSの実機で動作確認したコードで順を追って説明します。この記事のポイント
・cronやsystemdではSSH_AUTH_SOCKがないためGIT_SSH_COMMANDで鍵ファイルを明示する
・git status --porcelainはスクリプトで変更の有無を判定するのに最適な出力形式
・git pull --rebaseとgit stashを組み合わせてローカル変更がある状態でも安全に同期する
・git tag -aで注釈付きタグを自動付与し、デプロイ記録をリポジトリ履歴に残す
続きを読む "Gitリポジトリをシェルスクリプトから操作する設計|自動pull・差分検知・タグ付与を安全に実装する方法"
シェルスクリプトでバックアップの整合性を自動検証する設計|sha256sumとgzip -tで破損を検知する実践パターン
サーバー運用の現場でこの話を聞くたびに背筋が冷たくなります。定期的にrsyncやtarでバックアップを取っていても、ディスクエラー・転送中の破損・ファイルシステムの不整合などで、気づかないままアーカイブが壊れていることはあります。
この記事では、バックアップが本当に正常かを確認するシェルスクリプトの設計を解説します。sha256sumによるチェックサム照合とgzip -t / tar -tzfによるアーカイブ構造の検証を組み合わせ、trap ERRで障害を即通知する自動検証スクリプトの実装パターンを紹介します。
RHEL 9.4 / Ubuntu 24.04 LTS で動作確認済みです。
この記事のポイント
・sha256sum -c でチェックサムを照合し、バックアップファイルのビット破損を自動検知できる
・tar -tzf でgzip圧縮とtarアーカイブ構造を1コマンドで走査し、読み出し不能な破損を発見できる
・trap ERR を設定すると検証失敗時に自動通知が走り、無言の障害を防げる
・バックアップ直後にチェックサム生成→翌日に照合というパターンが設計の基本形
続きを読む "シェルスクリプトでバックアップの整合性を自動検証する設計|sha256sumとgzip -tで破損を検知する実践パターン"
シェルスクリプトのバッチ処理設計|大量ファイルの進捗管理と途中再開を実装する方法
シェルスクリプトで大量のファイルやレコードを処理するバッチ処理は、単純なforループで書けてしまうだけに、設計が後回しにされがちです。しかし「動くスクリプト」と「現場で安定稼働するスクリプト」の差は、進捗の可視化・チェックポイントによる途中再開・エラーの集約という3つの設計があるかどうかです。
この記事では、シェルスクリプトのバッチ処理に必要な設計パターンを順を追って解説します。ゼロから始めて最終的には、中断しても数分で再開できる実用スクリプトを組み上げます。動作確認はRHEL 9.4 / Ubuntu 24.04 LTSで行っています。
この記事のポイント
・find -print0 とprocess substitutionでスペース含むファイル名も安全に処理できる
・進捗カウンター(N/総数)を追加するだけで処理中の見通しが大幅に改善する
・チェックポイントファイルで中断後も処理済みをスキップして再開できる
・エラーを一時ファイルに収集して処理完了後に一括報告する設計が安全
シェルスクリプトの算術計算設計|bash二重括弧とbcでカウンター・閾値・浮動小数点を実装する方法
こうした疑問は、bashの算術機能が歴史的な経緯で複数の書き方を持っているために起きる。外部コマンドの
expr、bashビルトインの let、そして算術展開の $(( )) は、同じ整数演算を異なるアプローチで実現するが、選択を誤ると set -e 環境でスクリプトが意図せず終了するなどの罠にはまる。本記事では、現代のbashスクリプトで推奨される算術設計の指針を整理し、カウンター設計・閾値チェック・浮動小数点計算まで、実務で即使える実装パターンを解説する。
実行環境:RHEL 9.4 / Rocky Linux 9.4 / Ubuntu 22.04 LTS(bash 5.1.x)で動作確認済み。
この記事のポイント
・整数演算は $(( )) が第一選択 — 外部プロセス不要でスクリプト内で完結する
・if (( val > threshold )) の形で閾値チェックが直感的に書ける
・set -e 環境では let の終了コードの罠に要注意(結果が0で異常終了する)
・浮動小数点が必要なときだけ bc を呼び出す設計にする
シェルスクリプトでtarを使った増分バックアップを実装する方法|フルと差分の組み合わせと世代管理設計
現場でよくある失敗だ。フルバックアップは確かに確実だが、ファイルが数GB以上あれば毎日全量を圧縮するのはディスクにもCPUにも優しくない。
この記事では、
tar コマンドの --newer-mtime と GNU tar の --listed-incremental を使い、シェルスクリプトで増分・差分バックアップを実装する方法を解説する。週次フルバックアップ+日次差分バックアップの設計パターンと世代管理、cronによる完全自動化、リストア手順まで実践的に紹介する。この記事のポイント
・tar --newer-mtime で「差分バックアップ」を実装できる
・GNU tar の --listed-incremental で真の増分バックアップが実現する
・週次フル+日次差分の cron 設計でディスク消費を最小化できる
・リストア時はフル→差分の適用順序に注意が必要
シェルスクリプトのログ出力設計|ログレベル関数・タイムスタンプ・二重出力の実装パターン
そんな経験はないでしょうか。スクリプトを手動実行するとターミナルに出力が流れてくるので問題箇所をすぐ把握できますが、cron経由の自動実行では出力が残らず、どこで失敗したのかまったくわからないまま終わります。
「ログが残っていれば5分で解決できた障害調査が、ログがないせいで1時間かかった」——そんな経験を持つエンジニアは少なくありません。
この記事では、シェルスクリプトにINFO・WARN・ERRORのログレベル関数を組み込み、タイムスタンプとPIDを付けてファイルとターミナルに二重出力する設計を解説します。コピーしてすぐ使えるログ関数ライブラリから、古いログをfindで自動削除するローテーション設計まで、実務で使える実装パターンを紹介します。
実行環境:RHEL 9.4 / Ubuntu 24.04 LTS、bash 5.2(どちらでも同じ動作です)
この記事のポイント
・ INFOERRORのログレベル関数はbash組み込み機能だけで実装できる
・ exec 2>(teeでファイルとターミナルに同時出力できる
・ LOG_LEVEL環境変数1つでDEBUGと本番の出力を切り替えられる
・ findの-mtime +30で古いログを自動削除してディスクを守れる
シェルスクリプトのwhileループとポーリング設計|サービス起動待ち・ファイル生成待ち・条件成立まで繰り返す実装パターン
「別のバッチが出力するファイルが揃ってから処理を開始したいが、どう書けばいいか分からない」
こういった「条件が整うまで待機する」処理は、本番運用のシェルスクリプトでよく登場する。単純に
sleep 30で時間を埋める方法もあるが、必要以上に待たせたり、逆に待ち時間が足りずに失敗したりと、安定性に欠ける。この記事では、Linuxシェルスクリプトのwhileループを使ったポーリング設計を解説する。サービス起動待ち・ファイル生成待ち・URL応答待ちなど、現場でよく使うパターンをコード例付きで紹介し、タイムアウト設計・インターバル制御・ログ出力のベストプラクティスまでカバーする。動作確認はRHEL 9 / Rocky Linux 9 / Ubuntu 24.04 LTSで実施済みだ。
この記事のポイント
・whileループとsleepを組み合わせたポーリングの基本構造
・サービス起動・ファイル生成・URL応答待ちの実践パターン
・タイムアウトと上限回数で無限ループを確実に防ぐ設計
・ログ出力と終了コードで呼び出し元に状態を伝える設計
続きを読む "シェルスクリプトのwhileループとポーリング設計|サービス起動待ち・ファイル生成待ち・条件成立まで繰り返す実装パターン"
シェルスクリプトのプロファイリング設計|PS4変数とtimeでボトルネックを特定する方法
「set -xで実行トレースを有効にしても、タイムスタンプがないので処理時間がわからない」
シェルスクリプトは手軽に書けるぶん、パフォーマンス上の問題を抱えていても気づきにくい。ループ内で外部コマンドを繰り返し呼び出したり、パイプラインの段数が増えたりすると、実行時間が予想の数倍に膨らむことがある。
この記事では、PS4変数・EPOCHREALTIME・timeコマンドを組み合わせたプロファイリング設計を解説する。行レベルの実行時刻の記録から、ブロック単位の計測・ボトルネックの特定まで、RHEL 9.4 / Ubuntu 24.04 LTSで動作確認した実践パターンを紹介する。
この記事のポイント
・PS4変数にEPOCHREALTIMEを設定すると行単位で実行時刻を記録できる
・BASH_XTRACEFDでトレース出力を別ファイルに分離して後から分析できる
・time { ... }でスクリプト内のフェーズ別に処理時間を計測できる
・prof_start/prof_end関数でコードを汚さずプロファイリングを組み込める
bashのcallerコマンドでシェルスクリプトのコールスタックを記録する方法|エラー発生箇所と呼び出し元ログの設計
本番環境でこの状況に直面すると、デバッグに余計な時間を取られます。
bashには
caller という組み込みコマンドがあります。これを使うと、現在の関数が「どこから呼ばれたか」を行番号・ファイル名・関数名とともに取得できます。エラーハンドラに組み込むと、Pythonのトレースバックに相当するコールスタックをシェルスクリプトでも出力できます。この記事では、RHEL 9.4 / Ubuntu 24.04 LTSの実環境で動作確認した例をもとに、
caller コマンドの基本構文から trap ERR と組み合わせたコールスタックログの設計パターンまでを解説します。この記事のポイント
・caller は「この関数を呼んだ行番号・ファイル名・関数名」を返すbash組み込みコマンド
・caller 0 で直接の呼び出し元、caller N で N 段上の呼び出し元を取得できる
・while ループで caller を繰り返すと完全なコールスタックが生成できる
・trap ERR と組み合わせると、エラー発生時のスタックを自動記録できる
続きを読む "bashのcallerコマンドでシェルスクリプトのコールスタックを記録する方法|エラー発生箇所と呼び出し元ログの設計"
シェルスクリプトでSSL証明書の有効期限を自動監視する設計|opensslとcronで期限切れを防ぐ実践パターン
「Let'sEncryptのcertbotが失敗していたのに、誰も知らなかった」
証明書の期限切れはれっきとした障害だ。しかしその多くは「更新忘れ」ではなく「失敗に気づかない」という仕組みの問題で起きる。certbotによる自動更新を設定していても、HTTP-01チャレンジの失敗やポートブロックで更新できないケースがある。複数のドメインを担当していれば、管理台帳と実態がずれていることも珍しくない。
この記事では、
opensslコマンドとシェルスクリプトを組み合わせて、複数ドメインのSSL証明書有効期限を毎日自動チェックし、期限が近づいたらメールで通知する監視スクリプトを設計する。RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みの実装だ。この記事のポイント
・openssl s_clientで証明書の残日数を取得しシェル変数で管理できる
・set -euo pipefailとtrapを組み合わせて失敗を確実に検知できる
・30日前・7日前など警告レベルを分けてメール通知の優先度を設計できる
・複数ドメインをファイル管理して一括チェックするスクリプトを構築できる
続きを読む "シェルスクリプトでSSL証明書の有効期限を自動監視する設計|opensslとcronで期限切れを防ぐ実践パターン"
シェルスクリプトの終了コード設計|exit codeを体系化して呼び出し元がエラー原因を判別できる仕組み
exit code(終了コード)は、シェルスクリプトが呼び出し元に伝える唯一のシグナルだ。cronはこの値を見てメールを飛ばすか判断し、CI/CDパイプラインはここで次のステップに進むかを決める。ここを正しく設計しておかないと、エラーを握り潰したまま処理が続いてしまう。
この記事では、シェルスクリプトのexit codeを体系的に設計する方法を解説する。Linuxの慣例コード、関数内での正しい伝播パターン、cronやCI/CDとの連携設計まで、RHEL 9 / Rocky Linux 9 / Ubuntu 24.04 LTSで動作確認済みのコード例を交えて紹介する。
この記事のポイント
・exit 0が成功、1が汎用エラー、2が引数誤りという慣例を守ると呼び出し元で正確に分岐できる
・126・127・128+nはシェル予約コードなので、スクリプト独自の番号と重複させてはいけない
・関数内ではreturnで返し、呼び出し側が$?で受け取る設計が安全な伝播パターン
・local宣言と代入を同じ行に書くとexit codeが消える落とし穴があり、必ず分離する
続きを読む "シェルスクリプトの終了コード設計|exit codeを体系化して呼び出し元がエラー原因を判別できる仕組み"
シェルスクリプトのヒアドキュメント設計|設定ファイル・SQLクエリ・通知メール本文を動的生成する実装パターン
設定ファイルを動的に作りたい場面でechoを連ねると、クォートのエスケープが増えて視認性が一気に落ちます。SQLを複数行まとめてMySQLに渡したいときも、変数をどこで展開すべきか悩む場面があるでしょう。
この記事では、シェルスクリプトのヒアドキュメント(here document)を使った動的生成の設計パターンを解説します。基本3構文(変数展開ON/OFF・インデント対応)から、設定ファイル生成・SQL一括実行・通知メール本文の実践パターン、よくあるトラブルシュートまでを網羅します。動作確認環境はRHEL 9.4 / Ubuntu 24.04 LTSです。
この記事のポイント
・<<EOFは変数展開あり、<<'EOF'はシングルクォートで囲んで展開なしにできる
・<<-EOFを使うとタブでインデントした行頭を揃えてコードを整理できる
・ssh・mysql・mailコマンドと組み合わせると複数行の入力を安全に渡せる
・区切り文字はEOF以外の任意の文字列でよい。ネスト時は別名を使う
続きを読む "シェルスクリプトのヒアドキュメント設計|設定ファイル・SQLクエリ・通知メール本文を動的生成する実装パターン"
シェルスクリプトでディスク使用量を定期監視・自動クリーンアップする設計|閾値アラートと古いログ削除の実装パターン
「df -h を毎朝確認しているが、週末や連休は誰も見ていない。今月だけで2回、残り数GBになっていることに後で気づいた」
この問題は、ディスク使用量を自動監視して古いファイルを定期的に削除するシェルスクリプトを1本組み込むだけで、ほぼ解消できます。
この記事では、dfで使用率を数値取得して段階的にアラートを出す関数と、findで古いログを安全に削除するクリーンアップ設計を組み合わせた実装パターンを解説します。trapによるエラー処理と、cronに組み込む際の落とし穴も含め、RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みです。
この記事のポイント
・dfの出力から使用率を数値で取得し、80%/90%/95%の段階アラートを実装できる
・findの-mtimeで削除対象を事前確認してから安全に-deleteできる設計
・trapとset -euoでスクリプトの異常終了を確実に検知してsyslogに残せる
・cronで動かすときのPATH・MAILTO・リダイレクトの3点を押さえれば安定する
続きを読む "シェルスクリプトでディスク使用量を定期監視・自動クリーンアップする設計|閾値アラートと古いログ削除の実装パターン"
シェルスクリプトで複数サーバーへのSSH並列実行を設計する方法|結果集約とエラー検知の実践パターン
「夜間バッチで全サーバーの状態確認をまとめて実施したいが、1台でもタイムアウトしたら次のサーバーへ進めない」
この問題を解決するのが、シェルスクリプトによるSSH並列実行設計です。
&でコマンドをバックグラウンドに回し、wait $pidで個別の終了コードを収集する仕組みを使えば、20台のサーバーへのコマンド実行が数秒で完了します。この記事では、SSH並列実行の基本パターンから、タイムアウト制御・一時ファイルによる結果格納・障害サーバーの自動検知まで、設計層を順に解説します。RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みです。
この記事のポイント
・&とwait ${PIDS[$i]}でSSH接続を並列化して終了コードを個別収集できる
・mktemp + trap EXITで一時ファイルを確実にクリーンアップする設計が基本
・timeoutとConnectTimeoutの2段階で応答しないサーバーへの待ちを制限する
・障害サーバーを自動検知してFAILEDカウントをexit値として返す設計が推奨
シェルスクリプトのDRY RUN設計|--dry-runフラグと実行関数で危険な操作を安全にテストする方法
「デプロイスクリプトを実行したら、想定外のサーバーに対してサービス停止コマンドが走った」
こうした事故は「実行前に何が起きるか確認できていれば防げた」ケースがほとんどです。外部ツールには rsync
--dry-run や Ansible の --check モードがありますが、自作スクリプトにも同じ仕組みを組み込めます。この記事では、DRY RUNフラグと実行ラッパー関数を使って、危険な操作(削除・上書き・ネットワーク送信)を安全にテストできるシェルスクリプトの設計パターンを解説します。RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みです。
この記事のポイント
・DRY_RUN変数とexecute()関数で危険なコマンドの実行を一元制御できる
・--dry-runフラグで「実行しない」モードに切り替え、何が起きるかを事前確認できる
・DRY RUN時は[DRY-RUN]プレフィックスをログに出力して実行内容を可視化する
・バックアップ・デプロイスクリプトへそのまま転用できる実践パターンを紹介
続きを読む "シェルスクリプトのDRY RUN設計|--dry-runフラグと実行関数で危険な操作を安全にテストする方法"
シェルスクリプトでcurlとjqを使ってREST APIを自動操作する方法|認証ヘッダー・エラー処理・ページング設計の実装パターン
こうした要件でcurlを使ってREST APIを呼び出すシェルスクリプトを書こうとすると、認証エラーの扱い方がわからない、HTTPの4xxエラーをスクリプトが無視して処理を続けてしまう、といった問題に直面しやすい。
この記事では、curlとjqを組み合わせてREST APIを自動操作するシェルスクリプトの設計パターンを解説します。認証情報の安全な管理、HTTPステータスコードを使ったエラー検知、複数ページのレスポンスを取りまとめるページング設計まで、実際の実行結果を交えながら紹介します。
実行環境: RHEL 9.4 / Rocky Linux 9 / Ubuntu 24.04 LTS(bash 5.x、curl 7.76以上、jq 1.6以上)
この記事のポイント
・curl -s -oと-wでレスポンス本文とHTTPステータスコードを別々に受け取れる
・APIトークンはスクリプト内にハードコードせず環境変数かchmod 600ファイルで管理する
・HTTPステータスが4xx/5xxのときはスクリプトをexit 1で止める条件分岐が必須
・ページングはwhile true + 空配列でbreakの汎用パターンが実装しやすく可読性も高い
続きを読む "シェルスクリプトでcurlとjqを使ってREST APIを自動操作する方法|認証ヘッダー・エラー処理・ページング設計の実装パターン"
シェルスクリプトでrsyncバックアップの世代管理を実装する方法|古い世代を自動削除してディスク枯渇を防ぐ設計パターン
こういった状況に陥る原因は、バックアップを「取得する仕組み」はあっても「古いバックアップを削除する仕組み」と「失敗を検知する仕組み」がないためです。日付付きディレクトリへのrsyncは確実な手段ですが、削除ルールも通知の仕組みもなければ、ディスクが満杯になるまで誰も気づけません。
この記事では、最新N世代だけを保持して古いものを自動削除する「世代管理バックアップ」の設計パターンを解説します。YYYYMMDD-HHMMSS形式のディレクトリ命名規則・古い世代の削除関数・rsync --link-destを使ったハードリンク差分バックアップ・trap ERRによる失敗時メール通知・flockによる二重起動防止まで、RHEL 9.4 / Ubuntu 24.04 LTSで動作確認した実装で紹介します。
この記事のポイント
・世代管理は「削除ルール」を追加するだけでディスク枯渇を自動で防ぐ設計
・YYYYMMDD-HHMMSS形式のディレクトリ名はsortの文字列順が時系列順になる
・trap ERRとmailコマンドで失敗時の自動メール通知をスクリプトに組み込める
・flockで二重起動を防ぎ、rsync --link-destで実質的な差分バックアップを作れる
続きを読む "シェルスクリプトでrsyncバックアップの世代管理を実装する方法|古い世代を自動削除してディスク枯渇を防ぐ設計パターン"
シェルスクリプトの冪等設計|何度実行しても安全な初期設定スクリプトをステートファイルと条件分岐で実現する方法
「cronで動かしている初期化スクリプトが、2回目以降も毎回設定を上書きしてしまう」
セットアップや初期化を自動化するシェルスクリプトで、こういった問題に直面したことはないだろうか。原因のほとんどは「冪等性(べきとうせい)の欠如」にある。冪等とは「何度実行しても同じ結果になること」を指す。
この記事では、シェルスクリプトに冪等設計を組み込む3つの基本パターンと、サーバー初期設定スクリプトへの実践的な適用方法を解説する。CI/CDパイプラインでのデプロイ自動化から、障害後の再セットアップまで、そのまま使える設計を身につけてほしい。
この記事のポイント
・ステートファイルと条件分岐で「実行済みかどうか」を管理できる
・ユーザー・コマンド・ファイルは「存在確認してから作成」が鉄則
・設定ファイルの上書きは事前バックアップ+差分チェックで安全化できる
・冪等スクリプトはCI/CDや障害復旧にもそのまま再利用できる
続きを読む "シェルスクリプトの冪等設計|何度実行しても安全な初期設定スクリプトをステートファイルと条件分岐で実現する方法"
bashのcase文でシェルスクリプトの分岐を設計する方法|コマンド引数・OS種別・拡張子別処理の実践パターン
「条件が5つを超えてから自分でも把握しきれなくなり、バグが出るたびに頭を抱えている」
こういった状況は、シェルスクリプトを書き始めて少し経った頃に必ずぶつかる壁です。
この記事では、bash の
case 文を使った分岐設計を解説します。if-elif を使うべき場面と case 文を使うべき場面の違いから、コマンド引数の解析・OS種別の切り分け・ファイル拡張子別処理という現場で頻出する3つのパターン、そしてクォートや * (ワイルドカード) に関するハマりやすい落とし穴まで、RHEL 9.4 / Ubuntu 24.04 LTS の実機で動作確認したコードで解説します。さらに、サブコマンドが増えてきたときの代替設計として「連想配列ディスパッチテーブル」パターンと、case文を関数に切り出すときの変数スコープ設計も取り上げます。この記事のポイント
・case文は「1変数 vs 複数の固定値」の分岐でif-elifより圧倒的に読みやすい
・コマンド引数解析・OS種別判定・拡張子別処理の3パターンが頻出ユースケース
・*)は必ず末尾に置き、想定外入力を exit 1 でエラー終了させる設計が堅牢
・変数は必ず "$var" とクォートして空文字・スペース混入によるマッチ事故を防ぐ
・case文を関数に切り出すときは local と declare -r で変数スコープを管理する
続きを読む "bashのcase文でシェルスクリプトの分岐を設計する方法|コマンド引数・OS種別・拡張子別処理の実践パターン"
シェルスクリプトの起動前チェック設計|依存コマンド・環境変数・ディレクトリを自動検証する実装パターン
「BACKUP_DIRという変数をうっかりセットし忘れたら、スクリプトが意図しない場所にファイルを書き込もうとして失敗した」
こういった「走り始めてから失敗する」問題は、スクリプトの冒頭に起動前チェック(プリフライトチェック)を組み込むだけでほとんど防げます。
この記事では、依存コマンドの存在確認・必須環境変数の検証・ディレクトリの確認を関数化し、メイン処理の前に一括実行する設計パターンを解説します。バックアップスクリプト・デプロイスクリプトへの適用例も含め、RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みです。
この記事のポイント
・command -v でコマンドの存在を検証し、未インストールを即座に検知する
・必須環境変数は require_env 関数で存在チェックして早期終了する
・require_cmd / require_env / require_dir を preflight_check() にまとめる
・チェックが1つでも失敗したらメイン処理は実行しない設計が安全
シェルスクリプトの並列処理設計|&とwaitでバックグラウンドジョブを管理する方法
「バックアップスクリプトがディレクトリごとに逐次実行しているせいで、朝までに終わらない」
シェルスクリプトで運用を自動化していると、こうした「待ち時間をなんとかしたい」場面に必ず出くわします。逐次実行では対象が増えるほど線形に時間がかかり、10台のサーバーなら10倍のリードタイムが生じます。
この記事では、bashの
&(バックグラウンド実行演算子)と wait コマンドを使った並列処理設計を解説します。基本的な仕組みから、複数サーバーへの同時SSH実行・最大同時実行数の制御・競合状態の防止まで、実務で使えるパターンをまとめました。RHEL 9.4 / Ubuntu 24.04 LTS の bash 5.x 環境で動作確認済みです。この記事のポイント
・コマンド末尾に & を付けるとバックグラウンド実行になり、waitで全完了を待てる
・$! で直前の子プロセスのPIDを取得し、個別にwait/killで管理できる
・最大同時実行数はカウンタ変数と wait -n(bash 4.3以降)の組み合わせで制御できる
・並列書き込みの競合にはflockを、子プロセスのエラー検出には wait $pid の戻り値を使う
シェルスクリプトでデプロイを自動化する方法|ロールバック・排他制御・通知を組み込んだリリース設計
「途中で失敗したとき、どこまで進んだか分からなくなって焦った経験がある」
Linux サーバーへのリリース作業をシェルスクリプトで自動化すれば、この問題をまとめて解決できます。ただし「コマンドを並べただけ」のスクリプトは、失敗したときに中途半端な状態でサーバーを傷つけます。ロックもなければロールバックもない──そういったスクリプトが本番障害を起こすのは、残念ながらよくある話です。
この記事では、デプロイスクリプトに必ず組み込むべき3つの設計──排他制御・ロールバック・完了通知──を実機で動作確認しながら解説します。コピーしてすぐ使える雛形スクリプトも掲載していますので、参考にしてください。
実行環境:RHEL 9.4 / Ubuntu 24.04 LTS で動作確認済み
この記事のポイント
・flockコマンドで二重実行を防ぐ排他制御がデプロイスクリプトの基本
・rollback関数をtrap EXITに登録すると失敗時に旧バージョンへ自動切り戻せる
・ssコマンドでサービス起動を検証してからスクリプトを終了するのが安全設計
・通知はtrap EXITに集約し、成功・失敗どちらの経路でも確実に送出する
シェルスクリプトのロギング設計|ログ関数・タイムスタンプ・teeで出力を二重化する実践パターン
cronの実行環境にはターミナルがありません。標準出力はメール送信か /dev/null に消えるだけで、エラーが出ていても気づけません。バックアップが何日も失敗し続けていたのに確認できなかった、という経験のある方もいるでしょう。
この記事では、bashスクリプトにログ出力の「型」を組み込む設計パターンを解説します。ログ関数(log_info / log_warn / log_error)の実装から、ファイルとコンソールへの同時出力(tee)、cron実行時の注意点まで、現場ですぐ使えるコードと実行例を紹介します。動作確認環境はRHEL 9.4 / Ubuntu 24.04 LTSです。
この記事のポイント
・log_info/log_warn/log_errorの3関数でログレベルを統一できる
・execとteeを組み合わせるとファイルと画面に同時出力できる
・log_errorはstderrに出すとパイプラインで通知フィルタを挟める
・cron実行時はPATH・LANGが最小化され文字化けや「コマンドが見つからない」の原因になる
シェルスクリプトのプロセス置換設計|一時ファイルなしでコマンド出力をファイルとして渡す方法
bashには、それをまるごとなくせる構文があります。プロセス置換(Process Substitution)です。
<(command) と書くだけで、コマンドの出力をあたかもファイルのように別のコマンドへ渡せます。一時ファイルを作る必要はありません。この記事では、プロセス置換の仕組みから始め、
diff・paste・tee との組み合わせ、複数サーバーの設定差分確認やアーカイブ比較など実務パターンまでを解説します。動作確認環境はRHEL 9.4 / Ubuntu 24.04 LTSです。この記事のポイント
・<(command) でコマンド出力を一時ファイルなしに別コマンドのファイル入力として渡せる
・diff <(cmd1) <(cmd2) で2コマンドの出力を直接比較できる実務パターンが基本
・複数サーバーの設定差分確認やアーカイブ比較が1行のコマンドに収まる
・プロセス置換はbash専用(#!/bin/bash が必須)。#!/bin/sh では動作しない
シェルスクリプトの死活監視設計|curlとncコマンドでサービス状態を自動確認してアラートを送る方法
死活監視の仕組みがあれば、問題が起きた直後に自動でアラートを受け取ることができます。Zabbix・Prometheus・Nagios といった本格的な監視ツールは強力ですが、「特定のサービスだけを素早く監視したい」「ツール導入の手間をかけたくない」という現場では、シェルスクリプトで十分に機能する監視の仕組みが作れます。
この記事では、
curl と nc(netcat)を組み合わせたシェルスクリプトの死活監視設計を解説します。HTTP/HTTPS の応答確認・TCP ポートチェック・メールアラート送信・アラート連射防止の冷却設計まで、RHEL 9.4 / Ubuntu 24.04 LTS で動作確認した実践例を中心に紹介します。この記事のポイント
・curlの終了コードとHTTPステータスでWeb サービスの死活確認がワンライナーで書ける
・ncコマンドでTCPポートチェックを行い、Postfix など非HTTP系サービスも監視できる
・アラート連射を防ぐ「冷却期間設計」を組み込まないと障害復旧前にメールが爆発する
・cronで5分おきに実行しても負荷はほぼゼロで、1台でも多複数サービスを監視できる
シェルスクリプトのリトライ設計|指数バックオフと回数制限でコマンド再実行を安定させる方法
シェルスクリプトで外部リソース(API・データベース・ファイルシステム)を扱う場合、一時的なエラーが起きることは避けられません。そういった「一時的な失敗」に対して、単純に
set -e でスクリプトを止めるのではなく、リトライ(再実行)で自動回復させる設計が実務では重要です。この記事では、シェルスクリプトでのリトライ設計の基本から、指数バックオフ・ジッター・タイムアウトとの組み合わせまで、RHEL 9.4(bash 5.1)で動作確認した実践的なパターンを解説します。
この記事のポイント
・固定間隔リトライより指数バックオフで、サーバーへの集中アクセスを避けられる
・retry関数として実装することで、どのコマンドにもリトライを適用できる
・ジッターを加えると並行実行時の「連鎖障害」を防げる
・timeoutと組み合わせると、1回のリトライに上限時間を設けられる
bashのexecとファイルディスクリプタ操作|スクリプト全体のログをリダイレクトする設計
cronジョブやバッチ処理を設計したことがある人なら、一度は感じたことがある悩みです。
bash には、スクリプト起動直後にたった2行書くだけで、スクリプト全体のstdout(標準出力)とstderr(標準エラー出力)をまとめてログファイルにリダイレクトできる仕組みがあります。それが、bashの組み込みコマンド
exec によるファイルディスクリプタ(FD)操作です。この記事では、bashのexecを使ったFD操作の基礎から、cronジョブのログ集約・バッチ処理への応用・trapとの組み合わせまで、実務で使える設計パターンを具体的なコード例とともに解説します。
この記事のポイント
・exec 1>>logfile 2>&1 でスクリプト全体の出力を一括ログ保存できる
・exec はbashの組み込みコマンドであり、docker exec とは別ツール
・exec 3>&1 でFDを複製しておけば、途中でstdoutを元に戻せる
・trap EXIT と組み合わせてFDを確実に閉じる設計が現場の定石
bashのサブシェルと変数スコープの罠|()と{}の違い・パイプ先で変数が消える問題の対処
「パイプで繋いだコマンドの中で変数に代入したのに、後で参照したら空だった」
シェルスクリプトを書き始めると、必ずといっていいほどこの罠にハマります。原因はbashの「サブシェル」の仕様です。パイプや
()でくくったコマンドは、現在のシェルとは別のプロセス(サブシェル)として実行されるため、変数への変更が親シェルには伝わりません。この記事では、サブシェルの正体(何が起きているのか)から、
()と{}の違い、パイプ後の変数消失の回避策(process substitution・lastpipe・一時ファイル)まで、実際のコードで解説します。RHEL 9 / bash 5系で動作確認済みです。この記事のポイント
・パイプ(|)の右辺はサブシェルで動き変数変更が親に戻らない
・()はサブシェル生成、{}はカレントシェル実行で動作が全く異なる
・解決策は < <(...) のprocess substitutionが最もスマート
・bash 4.2以降はshopt -s lastpipeでパイプのまま対処できる
シェルスクリプトのエラー通知設計|mailx・sendmail・Webhookで障害をすぐ知らせる仕組みの作り方
これは特別なケースではなく、自動化が進んだサーバー運用現場では日常的に起きる「静かな失敗」の典型例です。cronで実行されるスクリプトがエラーで終了しても、誰かがログを確認しに行かない限り誰も気づきません。
この記事では、シェルスクリプト エラー通知の設計手法として、mailxによるメール送信・sendmailによるMTA直接利用・Slack Webhookによるリアルタイム通知の3方式を、RHEL 9.4 / Ubuntu 24.04 LTSで動作確認した実行例とともに解説します。trapコマンドと組み合わせた自動通知テンプレートも紹介するので、既存のcronスクリプトにすぐ組み込めます。
この記事のポイント
・シェルスクリプト エラー通知の最短実装は「echo 本文 | mailx -s 件名 宛先」の1行
・trap ERR でエラーを自動検知し、通知関数を呼び出すのが実務の基本設計
・Slack Webhook は curl 1コマンドで送れ、メールより即時性が高い
・sendmail はメールヘッダを自由に制御でき、From アドレスを明示したい場合に使う
続きを読む "シェルスクリプトのエラー通知設計|mailx・sendmail・Webhookで障害をすぐ知らせる仕組みの作り方"
自作シェルスクリプトをsystemdサービス化して常駐運用する方法|Unitファイル作成・Restart設定・ログ確認
「スクリプトが落ちたとき、自動で再起動させたい」
定期実行ならcronで済みますが、「常に動かし続けたい」用途にはcronは向いていません。そこで登場するのが、systemdのServiceユニットです。Serviceとして登録することで、OS起動時の自動起動・異常終了時の自動復旧・journaldによるログの一元管理が実現します。
この記事では、自作シェルスクリプトをsystemdサービスとして常駐運用する手順を解説します。Unitファイルの基本構造、ExecStartPre/ExecStartPost、Restart設定、journalctlによるログ確認、よくあるエラーと対処法、そしてバックアップスクリプトのサービス化まで、RHEL 9.4 / Ubuntu 24.04 LTSで動作確認した手順をお伝えします。
この記事のポイント
・.serviceファイルはUnit/Service/Installの3セクションで構成する
・ExecStartには必ず絶対パスを指定する(相対パスはNG)
・Restart=on-failure + RestartSec=10 で自動復旧を設計できる
・journalctl -u サービス名 -f でリアルタイムログを確認できる
続きを読む "自作シェルスクリプトをsystemdサービス化して常駐運用する方法|Unitファイル作成・Restart設定・ログ確認"
bashのPIPESTATUSとset -o pipefailでパイプラインの失敗を検知する方法|パイプ途中のエラーを見逃さない設計
「ログ集計コマンドでパイプ途中にエラーが出ていたのに、スクリプトは終了コード0を返していた」
こういったトラブルの多くは、bashのパイプラインが持つデフォルト動作に起因しています。bashは標準設定では パイプラインの最後のコマンドの終了コードだけを参照します。途中のコマンドが失敗していても、スクリプトはそのまま次の処理に進んでしまいます。
この記事では、bashの組み込み変数
$PIPESTATUS と set -o pipefail を使って、パイプライン途中の失敗を確実に検知する方法を解説します。RHEL 9.4 / Ubuntu 24.04 LTS で動作確認した実行例とともに、バックアップスクリプト・ログ処理パイプライン・trapを組み合わせた本番設計まで網羅します。この記事のポイント
・set -o pipefail を設定するとパイプ途中の失敗でパイプライン全体が非ゼロを返す
・$PIPESTATUS 配列で各コマンドの終了コードを個別に参照できる
・$PIPESTATUS はすぐに上書きされるため、実行直後に別変数にコピーするのが定石
・set -e・set -u・set -o pipefail の3つを組み合わせると堅牢なエラー検知になる
・trap cleanup EXIT を加えると、パイプ失敗時の後始末処理を確実に実行できる
続きを読む "bashのPIPESTATUSとset -o pipefailでパイプラインの失敗を検知する方法|パイプ途中のエラーを見逃さない設計"
シェルスクリプトのセキュリティ設計|クォート徹底・コマンドインジェクション対策・evalを避ける書き方
「ファイル名にスペースが入っていただけで、バックアップ処理が途中で壊れた」
シェルスクリプトの脆弱性は、難解な暗号理論や複雑なプロトコル知識とは無縁のところで生まれる。クォートの省略、外部入力の無検証使用、eval の安易な利用——いずれも「ちょっとした書き方の癖」が招く問題だ。
この記事では、シェルスクリプトのセキュリティ設計の基本を具体的に解説する。RHEL 9.4 / Ubuntu 24.04 LTS の bash 5.x 環境で動作確認した実例をもとに、クォートの徹底からコマンドインジェクション対策、eval を避ける書き方、set -u・mktemp・IFS リセットまでを体系的にカバーする。
この記事のポイント
・変数は必ずダブルクォートで囲む("$var" が安全な基本形)
・外部入力はバリデーション後にコマンドへ渡す(インジェクション対策の核心)
・eval は使わない。配列・declare・case 文で安全に代替できる
・set -u・IFSリセット・mktemp でスクリプト全体を堅牢化する
#!/bin/shと#!/bin/bashの違いとPOSIX互換スクリプトの書き方|dash環境で壊れないための移植性設計
RHEL では問題なく動いていたのに、Ubuntu に持っていったとたん構文エラーが出る。この現象で困ったことはないでしょうか。
原因のほとんどは、シェバン行(shebang)の意味を正確に理解していないことにあります。
#!/bin/sh はすべての環境で bash を呼び出すわけではありません。Ubuntu では /bin/sh が dash(軽量POSIXシェル)に向いているため、bash 固有の構文(bashism)を含むスクリプトが即座に壊れます。この記事では、
#!/bin/sh と #!/bin/bash の本質的な違いから、Ubuntu の dash 環境で壊れる典型パターン、POSIX準拠の書き方、そして checkbashisms コマンドによる自動検出まで、sh bash 違い posix の観点から移植性の高いスクリプト設計を体系的に解説します。動作確認環境: Ubuntu 24.04 LTS(dash 0.5.12)/ RHEL 9.4(bash 5.1.8)
この記事のポイント
・#!/bin/sh は OS 標準シェルを使う指定。Ubuntu では dash、RHEL では bash が実行される
・bash 固有構文(bashism)を使うと Ubuntu の dash で構文エラーになる
・POSIX準拠で書けば sh/bash どちらの環境でもそのまま動く移植性になる
・checkbashisms コマンドで bashism を事前に自動検出できる
続きを読む "#!/bin/shと#!/bin/bashの違いとPOSIX互換スクリプトの書き方|dash環境で壊れないための移植性設計"
readとselectで対話式シェルスクリプトを作る方法|確認プロンプト・メニュー選択・入力検証の設計
バックアップスクリプトや設定変更スクリプトを書いていると、ひとつのミスで取り返しのつかない操作を実行してしまうことがある。
この記事では、bash組み込みコマンドの
read と select を使った対話式シェルスクリプトの作り方を解説する。確認プロンプト・番号付きメニュー選択・入力検証のパターンを、実際のスクリプトとともに紹介する。なお
expect コマンドは「スクリプトが受け取るプロンプトへ自動で答える」ツールであるのに対し、read/select は「人間の判断をスクリプトに組み込む」用途に使う。棲み分けを押さえておくと迷わない。この記事のポイント
・read -p でプロンプト付きのユーザー入力を1行で受け取れる
・select でPS3プロンプト付きの番号メニューを簡単に実装できる
・while ループと条件分岐で「正しい入力が来るまで繰り返す」UIが作れる
・入力検証を外出しした関数にすると再利用しやすい
bats-coreでシェルスクリプトをテストする方法|ユニットテストの書き方とCI自動実行
少し修正するたびに全パターンを手動で確認するのは、スクリプトが複雑になるほど現実的ではありません。バグを気づかずに本番環境へ持ち込んでしまったり、修正のたびに既存の動作を壊していないか不安になったりすることもあるでしょう。
この記事では、Bash製シェルスクリプト向けテストフレームワーク bats-core を使って、ユニットテストを自動実行する方法を解説します。
インストールから基本的なテストの書き方、前処理・後処理(setup/teardown)、モック関数の定義、GitHub ActionsでのCI設定まで、実際のコードを交えて説明します。
動作確認環境:Ubuntu 24.04 LTS / RHEL 9.4(Rocky Linux 9.4 でも確認済み)
この記事のポイント
・bats-coreはBashスクリプト専用テストフレームワーク
・@testブロックでテストケースを簡潔に定義できる
・setup/teardownで前後処理を各テストから分離できる
・GitHub ActionsでCI自動テストの実行が可能
シェルスクリプトの設定を外部ファイル化する設計|sourceと.envで環境別に切り替える方法
規模が小さいスクリプトならハードコードでも何とかなる。しかし、環境が開発・検証・本番と増え、複数人で管理するようになった瞬間、その設計の甘さが噴き出す。
この記事では、sourceコマンドを使ってシェルスクリプトの設定を外部ファイルに切り出す方法と、環境別(開発・本番)に設定を切り替える実践的な設計を解説する。RHEL 9 / Rocky Linux 9 / Ubuntu 24.04 LTS で動作確認済みのコード例を交えて紹介する。
この記事のポイント
・source コマンドで外部設定ファイルを読み込み、設定とロジックを分離できる
・APP_ENV 変数で development/production を判定し、設定ファイルを自動切り替えできる
・.env 形式に export を付けた設定管理が現場での実務標準
・必須変数チェックと :=(デフォルト値)で、想定外エラーを未然に防げる
bashのパラメータ展開で文字列処理を完結させる方法|${var%}・${var//}でsed・awkの外部呼び出しを減らす設計
bashのパラメータ展開で文字列処理を完結させる方法|${var%}・${var//}でsed・awkの外部呼び出しを減らす設計
「ファイル名から拡張子だけ取り除きたいのに、毎回sedを書くのが面倒で...」
「ループの中で変数の一部を置換したいだけなのに、awkまで呼び出してしまっている」
こういった状況に覚えがあるなら、bashのパラメータ展開を使いこなすことでスクリプトをシンプルかつ高速にできます。bashには変数の中身を直接操作する組み込みの文字列処理機能が揃っており、外部コマンドを呼ばずにほとんどの変数内文字列操作を完結できます。
この記事では、bashパラメータ展開の基本構文から実践的な設計パターンまでを体系的に解説します。sed・awk・cut・trといった外部コマンドとの使い分けの指針も示します。動作確認環境はbash 5.2.x(RHEL 9.4 / Ubuntu 24.04 LTS)です。
この記事のポイント
・${var%pattern}と${var#pattern}で拡張子・ディレクトリを分離できる
・${var//pattern/replacement}でsed不要の変数内一括置換が可能
・${var^^}/${var,,}でtr不要の大文字・小文字変換ができる
・ループ内の外部コマンド呼び出しを排除しスクリプトを高速化できる
続きを読む "bashのパラメータ展開で文字列処理を完結させる方法|${var%}・${var//}でsed・awkの外部呼び出しを減らす設計"
shellcheckでシェルスクリプトを静的解析する方法|インストールからCI組み込み・頻出警告の直し方まで
bash や sh のスクリプトには型チェックもコンパイルもない。変数展開のクォート漏れ・バッククォートのネスト・非推奨構文といったバグは、実際に走らせてみるまで気づきにくい。
この記事では、shellcheck 静的解析の実践的な使い方を解説する。インストール方法(apt・dnf・brew・バイナリ)から、SC2086・SC2006・SC2046 など頻出警告の読み方と修正法、Vim・VS Code でのエディタ統合、そして GitHub Actions / GitLab CI への組み込みまでを実際の出力例と合わせて説明する。
動作確認環境: RHEL 9.4 / Rocky Linux 9.4 / Ubuntu 24.04 LTS / shellcheck 0.9.0
この記事のポイント
・shellcheck は実行前に静的解析でバグを検出するコマンドラインツール
・SC2086(クォート不足)・SC2006(バッククォート)が最多の警告パターン
・apt/dnf/brew/バイナリでインストール可能。GitHub Actions なら公式 Action あり
・set -x は実行時デバッグ、shellcheck は実行前の静的検査——役割がまったく異なる
続きを読む "shellcheckでシェルスクリプトを静的解析する方法|インストールからCI組み込み・頻出警告の直し方まで"
bashで関数を定義して再利用する方法|シェルスクリプトのライブラリ化と実践例
Linuxのシェルスクリプトを書いていると、こうした非効率にぶつかります。解決策は関数(function)です。繰り返し使う処理を関数にまとめておけば、呼び出すだけで済み、修正も1箇所で完結します。
この記事では、bashで関数を定義・呼び出す基本構文から、引数の扱い・戻り値・ローカル変数の使い方、さらに複数スクリプトから再利用できる「ライブラリ化」の手法まで、RHEL 9.4 / Ubuntu 24.04 LTSで動作確認した実践例とともに解説します。
この記事のポイント
・bash の関数は function 名 { } または 名 () { } の2通りで定義できる
・引数は $1 $2 ... で受け取り、return で整数の終了ステータスを返す
・local 宣言でローカル変数にすればグローバル変数との衝突を防げる
・source(.コマンド)でライブラリ化し、複数スクリプトから共有する
シェルスクリプトでバックアップ自動化を作る実践|cronとログ設計まで
バックアップの自動化は、シェルスクリプトとcronを組み合わせるだけで実現できます。ただし、動けばOKのスクリプトと、現場で長期間安定稼働するスクリプトには大きな差があります。エラーを検知してアラートを送る仕組み、ログへの記録、古いファイルの世代管理、そしてcronの二重起動防止。これらをまとめて設計してはじめて「運用に耐えるバックアップ」になります。
この記事では、シェルスクリプトでバックアップ処理を書き、cronで定期実行し、ログに残し、失敗時にアラートを送るところまでを実践的に解説します。さらにcronジョブの二重起動を防ぐ
flockの使い方も加えました。RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みのコードを使って、コピーして使えるレベルまで仕上げます。この記事のポイント
・シェルスクリプトでrsyncを使ったバックアップ処理を安全に書ける
・trapでどの段階の失敗でもアラートを確実に届ける設計にできる
・cronで定期実行するときの環境変数・パスの落とし穴を避けられる
・flockで二重起動を防ぎcronジョブの競合を確実に回避できる
・バックアップ失敗時にメールまたはWebhookでアラートを自動送信できる
現場で壊れないシェルスクリプト設計|エラー処理とtrapで安定運用する書き方
「一時ファイルが大量に残ってしまい、ディスクがあふれた」
「設定変更スクリプトが途中で止まって、サーバーが中途半端な状態になった」
現場でシェルスクリプトを運用していると、こういった事態に一度は遭遇します。スクリプト自体は「動いている」のに、エラーが発生してもそのまま処理が継続してしまい、気づいたときには手遅れ。あるいは途中で止まっても後始末が走らず、環境が壊れたまま残る。こうした問題の根本原因は、エラー処理が考慮されていない設計にあります。
この記事では、シェルスクリプト trap コマンドとエラー処理の組み合わせについて、現場で即使えるパターンを解説します。
「set -e の落とし穴」「trap の正しい使い方」「ロールバック設計(完了済みステップを逆順に取り消す方法)」「バックアップスクリプトへの実践的な組み込み方」「エラーログと通知設計」「trap が効かないケースのトラブルシュート」まで、壊れないスクリプト設計の全体像をカバーします。
動作確認環境: RHEL 9.4 / Rocky Linux 9.4(bash 5.1.8)
この記事のポイント
・set -e と set -u でコマンド失敗・未定義変数を即検知できる
・trap でシグナル受信時・スクリプト終了時の後処理を自動実行できる
・EXIT トラップを使えばスクリプトがどう終了しても後始末が確実に実行される
・ROLLBACK_STACK 配列に取り消し関数を積めばステップ単位のロールバックが実現できる
・ERR トラップ+$LINENO でコマンド失敗の行番号を正確に記録できる
・SIGKILL やサブシェル内では trap が効かない落とし穴も解説する
expectコマンドでLinuxの対話型処理を自動化する方法|パスワード入力・SSHログイン・telnetの自動操作実践例
ssh-keygen や sudo passwd など、対話的に応答を求めてくるコマンドは、通常のシェルスクリプトでは自動化が難しい。
sshpass は使えても、複数の質問に順番に答えるような複雑な対話は手に負えなかったりする。この記事では、対話型コマンドを自動化するためのツール
expect の実践的な使い方を解説する。基本構文から、SSHログイン自動化、パスワード変更スクリプト、タイムアウト処理まで、現場で実際に使えるパターンを紹介する。動作確認環境: RHEL 9.4 / Ubuntu 24.04 LTS
この記事のポイント
・expect は spawn(起動)・expect(待機)・send(入力)の3コマンドで構成される
・SSHのパスワード入力やsudo対話を完全無人化できるが、鍵認証の方が安全でシンプル
・spawn -noecho と log_user 0 でパスワードをターミナルに表示しないよう制御できる
・expect_background ではなく exp_continue でループを回すのが実践の定番パターン
続きを読む "expectコマンドでLinuxの対話型処理を自動化する方法|パスワード入力・SSHログイン・telnetの自動操作実践例"
flockコマンドでシェルスクリプトの排他制御を行う方法|二重実行防止とロックファイルの実践例
「複数のサーバーから同じスクリプトを呼び出すと、データが壊れることがある」
こうした問題は、排他制御(ロック)の仕組みを使えば防ぐことができます。Linuxには
flock という便利なコマンドがあり、シェルスクリプトに数行追加するだけでスクリプトの二重実行を確実に防げます。この記事では、
flock コマンドの基本的な使い方から、cronとの組み合わせ方、ロックが残り続けるデッドロックの防ぎ方まで、RHEL 9.4 / Ubuntu 24.04 LTS で動作確認した実践的な手順を解説します。この記事のポイント
・flock コマンドはロックファイルを使ってスクリプトの二重実行を防ぐ
・flock -n でロック失敗時にすぐ終了、-w でタイムアウト付き待機ができる
・cron + flock の組み合わせで定期ジョブの重複実行を防ぐのが定番構成
・スクリプト終了時にロックは自動解放されるためデッドロックになりにくい
mkfifoコマンドで名前付きパイプを作成する方法|プロセス間通信とパイプの実践例
こういった場面で役立つのが、名前付きパイプ(FIFO)です。通常のパイプ(|)は2つのコマンドを直結するだけですが、名前付きパイプはファイルシステム上にパイプを「実体化」します。異なるシェルや無関係なプロセス同士でも、ファイル名を通じてデータをやりとりできる点が大きな違いです。
この記事では、
mkfifoコマンドの使い方を基礎から解説します。名前付きパイプの仕組みと通常のパイプとの違い、実際の作成手順、プロセス間通信への応用例、そしてよくある落とし穴まで、実機での動作確認をまじえて説明します。この記事のポイント
・mkfifo コマンドでFIFO特殊ファイル(名前付きパイプ)を作成できる
・名前付きパイプは異なるシェル・プロセス間でデータを受け渡す手段になる
・FIFOへの書き込みは読み手がいるまでブロックされる特性がある
・rm で削除するまでファイルシステム上に残り続ける点が通常パイプと異なる
Linuxでファイルパス一覧から各ファイルを別フォルダへ一括移動する方法|while readループの実践
現場でこういう作業は珍しくありません。バックアップ対象のパス一覧、移行対象ファイルのリスト、ログ整理の候補ファイル一覧……テキストファイルに書き出されたフルパスを読み込んで一括処理したい場面は意外と多いものです。
この記事では、while readループを使ってパス一覧から各ファイルを別フォルダへ一括移動する方法を実践的に解説します。
基本形から始まり、移動先フォルダの自動作成・コピー版・エラースキップまで、現場で使える応用例も網羅します。
この記事のポイント
・while read line; do mv "$line" 移動先; done < ファイル一覧が基本形
・IFS= read -r line で行頭・行末スペースとバックスラッシュを安全に扱える
・mkdir -p "$(dirname ...)" でフォルダ自動作成しながら移動できる
・移動失敗時は || echo で続行させてログに残すのが現場の鉄則
続きを読む "Linuxでファイルパス一覧から各ファイルを別フォルダへ一括移動する方法|while readループの実践"
bashの配列(Array)の使い方|宣言・追加・ループ・連想配列の実践例
「シェルスクリプトで複数のサーバー名や設定値をまとめて扱いたいのに、毎回変数を個別に定義するのが面倒だ」
そんな悩みを抱えながら、変数1個ずつを地道に書き続けていませんか。
この記事では、bashの配列(Array)の宣言・要素の追加・ループ処理・連想配列(Associative Array)まで、実務で使える形で一通り解説します。
RHEL 9.4 / Ubuntu 24.04 LTS のbash 5系で動作確認済みの手順です。配列をマスターすると、複数ホストへの一括処理やバックアップスクリプトの記述がぐっとシンプルになります。
この記事のポイント
・bash配列は `arr=(a b c)` で宣言し、`${arr[0]}` でインデックス参照できる
・`${arr[@]}` で全要素展開、`${#arr[@]}` で要素数の取得が可能
・連想配列は `declare -A` で宣言し、キーと値のペアで管理できる
・for文との組み合わせでサーバー一括処理・ファイル操作の自動化に直結する
bashのヒアドキュメント(here document)の使い方|設定ファイル生成・コマンド入力・インデントの実践例
「スクリプトの中でコマンドに複数行の入力を渡したい」
こうした場面で使うのがbashのヒアドキュメント(here document)です。
echo を何十行も並べる必要はありません。
<< 演算子を使えば、複数行のテキストをそのまま扱えます。この記事では、ヒアドキュメントの基本構文から、設定ファイルの生成・シェルスクリプト内でのコマンド入力・インデント制御まで、現場で即使える実践的な使い方を解説します。RHEL 9.4 / Ubuntu 24.04 LTS で動作確認済みです。
この記事のポイント
・<<EOF で複数行テキストをそのままコマンドに渡せる
・<<'EOF'(シングルクォート)で変数展開を抑止できる
・<<-EOF でインデントのタブを自動除去できる
・設定ファイル生成・mysql入力・ssh越し実行の3パターンが定番
続きを読む "bashのヒアドキュメント(here document)の使い方|設定ファイル生成・コマンド入力・インデントの実践例"
gitコマンドの使い方入門|init・clone・commit・pushの基本とLinuxサーバーでの実践例
「git commit や git push の違いが頭の中でごっちゃになっている」
Linuxサーバーを扱う現場では、設定ファイルやスクリプトのバージョン管理にgitを使うケースが当たり前になっています。WSL2やVPSでLinuxを触り始めた方が「次に学ぶべきもの」としても、gitはとても自然なステップです。コンテナ・IaCツール(Ansible、Terraform)との連携でも、gitの操作は避けて通れません。
この記事では、Linuxサーバー上でgitコマンドを初めて使う方に向けて、インストールと初期設定からcommit・push・branchの基本操作、GitHubへのSSH接続、よくあるエラーの対処法まで体系的に解説します。RHEL 9.4 / Ubuntu 24.04 LTS(WSL2含む)で動作確認済みです。
この記事のポイント
・git init でローカルリポジトリを作成し、git add → git commit の流れで変更を記録する
・git clone でリモートリポジトリをサーバーへ取得し、git push で変更を反映する
・GitHubへの接続はSSH公開鍵(ed25519)認証が安全で標準的な方法
・.gitconfigの初期設定(user.name・user.email・init.defaultBranch)は最初に済ませる
続きを読む "gitコマンドの使い方入門|init・clone・commit・pushの基本とLinuxサーバーでの実践例"
bashのfor文・while文・until文の使い方|ループ処理の基本から実践例まで
「for文とwhile文の使い分けが曖昧なまま、なんとなくコピペして使っている」
こう感じたことがある方は多いはずです。ループ処理はシェルスクリプトの核心部分であり、ここを押さえるだけで自動化できる作業の幅が一気に広がります。
この記事では、bashのfor文・while文・until文の書き方を基礎から解説します。単純な繰り返しから、ファイル一括処理・カウンタループ・break/continueによる制御まで、現場で実際に使えるパターンを中心に紹介します。
この記事のポイント
・for文はリストの各要素を順番に処理する基本ループ
・while文は「条件が真の間」繰り返す。ファイルの行読み込みに最適
・until文は「条件が偽の間」繰り返す。ポーリング処理に便利
・break/continueで途中スキップ・終了ができる
bashのif文とtest条件式の使い方|ファイル・文字列・数値の比較から実践例まで
「test条件式の書き方がいくつかあって、どれを使えばいいのか分からない」
bashのif文はシェルスクリプトの中で最も使用頻度が高い構文のひとつです。ファイルの存在確認、文字列の比較、数値の大小判定など、スクリプトの自動化ロジックはほぼすべてif文で成り立っています。ところが、testコマンドや[ ]、[[ ]]など複数の書き方があり、初めて学ぶ人が混乱しやすいポイントでもあります。
この記事では、bashのif文とtest条件式の基本から、ファイル操作・文字列・数値・コマンドの終了ステータスを使った実践的な比較パターンまで体系的に解説します。RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みです。
この記事のポイント
・ bashのif文はtest/[ ]/[[ ]]の3種類があり、用途で使い分ける
・ ファイル確認は-eや-fなど単項演算子、文字列比較は= と!=が基本
・ 数値比較は-eq・-lt・-gtなどtestコマンド専用の演算子を使う
・ 実務では終了ステータス($?)の活用とelifによる多岐分岐が重要
atコマンドでLinuxのワンショットジョブを実行する方法|crontabとの使い分けと実践例
そんな場面に刺さるのが at コマンドです。
at は「指定した時刻に1回だけコマンドを実行する」ためのジョブスケジューラーです。crontab のように繰り返し実行する設定は不要で、実行が終わればジョブは自動的に消えます。
この記事では、at コマンドの基本的な使い方から、ジョブの確認・削除、crontab・systemd timer との使い分けまでを RHEL 9.4 / Ubuntu 24.04 LTS で動作確認した内容をもとに解説します。
この記事のポイント
・at コマンドは「1回だけ・指定時刻に」ジョブを実行するワンショットスケジューラー
・at -l(atq)でキュー確認、atrm でジョブ削除ができる
・crontab は繰り返し実行、at はワンショット、systemd timer は高機能な1回実行に使い分ける
・atd サービスが起動していないと at は動かない——まず systemctl status atd で確認する
while readコマンドでシェルスクリプトのファイルを1行ずつ処理する方法|IFS設定とCSV・ログ解析の実践例も
そんなつまずきを抱えたまま、forループやcatを組み合わせて試行錯誤していませんか。
実は、Bashには
while read というファイルを1行ずつ読み込むための専用の書き方があります。ログファイルの解析、CSVの一括処理、サーバー一覧への順次SSH接続など、現場で繰り返し使う場面がある実務必須の構文です。
この記事では、
while read の基本構文から、IFSによる区切り文字のカスタマイズ、CSVやTSVの処理、よくあるトラブルの対処法まで、RHEL 9.4 / Ubuntu 24.04 LTS の動作確認済みコマンドで解説します。
この記事のポイント
・ while read line でファイルを1行ずつ確実に処理できる
・ IFS=","で区切り文字を変えればCSV・TSVにも対応できる
・ while readはfor+catより安全で空白・改行を壊さない
・ 末尾改行なし・バックスラッシュ・末尾スペースに注意が必要
続きを読む "while readコマンドでシェルスクリプトのファイルを1行ずつ処理する方法|IFS設定とCSV・ログ解析の実践例も"
mktempコマンドでシェルスクリプトの一時ファイルを安全に作成する方法|並列処理の衝突防止と自動削除も
そんな経験はありませんか?
一時ファイルの名前を固定していると、並列実行時の上書き・競合リスクがあります。
mktemp コマンドを使えば、重複しないユニークなファイル名を自動生成できます。
この記事では、mktemp コマンドの基本的な使い方から、シェルスクリプトでの安全な一時ファイル管理、自動削除(trap との組み合わせ)まで解説します。
RHEL 9.4 / Ubuntu 24.04 LTS で動作確認済みです。
この記事のポイント
・mktemp でユニークな一時ファイルを自動生成できる
・-d オプションで一時ディレクトリも作れる
・trap と組み合わせてスクリプト終了時に自動削除する
・並列実行時の競合・上書き事故を根本から防げる
続きを読む "mktempコマンドでシェルスクリプトの一時ファイルを安全に作成する方法|並列処理の衝突防止と自動削除も"
printfコマンドでシェルスクリプトの出力を整形する方法|echoとの違いや書式指定・色付き出力も
こんな悩みを持ったことはありませんか?
Linux の printf コマンドは、C言語の printf 関数と同じ書式指定でテキストを出力できるコマンドです。echo では難しい「フォーマット制御」「数値のゼロ埋め」「エスケープシーケンス」などを正確に扱えます。
この記事では、printf コマンドの基本構文から始まり、書式指定子・エスケープシーケンス・実務でよく使うパターン・echo との使い分け・トラブルシュートまでを実行例付きで解説します。
この記事のポイント
・printf "%s\n" で echo より確実に文字列を出力できる
・%d・%05d・%f で数値のゼロ埋め・小数点桁数を制御できる
・\e[32m 等のANSIコードで端末出力を色付けできる
・echo と printf の使い分けは「書式が必要かどうか」で判断する
set -xコマンドでシェルスクリプトをデバッグする方法|set -e・set -uとの組み合わせも
「どこで止まっているのか、原因が全くわからない」
シェルスクリプトのデバッグは、初心者だけでなく中級者でも手が止まりやすいポイントです。Linuxサーバーの運用自動化を進めるほど、スクリプトが複雑になり、バグの原因追跡が難しくなります。
この記事では、Bashの組み込みオプション
set -x(トレースモード)を中心に、set -e(エラー即終了)・set -u(未定義変数をエラーに)・set -o pipefail(パイプ途中の失敗を検知)・trap ERR(エラー時のクリーンアップ)との組み合わせによるデバッグ・安全化の手法を解説します。RHEL 9.4 / Ubuntu 24.04 LTS で動作確認済みの実践的な内容です。この記事のポイント
・set -x を使うと実行コマンドがトレース表示されデバッグが容易になる
・set -euo pipefail の3フラグでコマンド失敗・未定義変数・パイプエラーをまとめて防げる
・trap ERR でエラー行番号・関数名を自動記録して原因特定が格段に速くなる
・trap EXIT と die 関数を組み合わせると後片付けとエラー通知を一元管理できる
jqコマンドでJSONを解析・加工する方法|フィルタ・整形・抽出の実践例も
jq コマンドです。
この記事では、jq の基本的なインストールから、JSON整形・フィールド抽出・配列処理・条件フィルタリング、そしてシェルスクリプトへの組み込みまで、現場で実際に使われるノウハウをまとめて解説します。
RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みです。
この記事のポイント
・jq . でJSONを整形して人間が読みやすい形に変換できる
・.フィールド名でネストしたキーも簡単に抽出できる
・.[index]や.[]で配列要素の取り出しや展開ができる
・select()で条件フィルタリングし、必要なデータだけ抽出できる
envsubstコマンドでシェル変数を環境変数で展開する方法|テンプレートファイルの動的生成と実務活用も
「Dockerfileや nginx.conf のIPアドレス・ドメインをまとめて差し替えたい。」
こういった悩みを抱えているなら、envsubst コマンドがそのまま解決策になります。
envsubst は環境変数をテンプレート文字列に埋め込むだけのシンプルなコマンドですが、
設定ファイルの動的生成・CI/CD パイプライン・Docker エントリーポイントと組み合わせると
驚くほどの作業を自動化できます。
この記事では、envsubst コマンドの基本から実務でよく使うパターンまで
RHEL 9.4 / Ubuntu 24.04 LTS の実機で確認した手順で解説します。
この記事のポイント
・envsubst はテンプレートの $VAR を環境変数で一括置換するコマンド
・置換対象変数を限定する書き方で誤置換を防げる
・nginx.conf や Docker エントリーポイントとの組み合わせが実務の定番
・変数が未定義の場合は空文字に展開される点に注意
続きを読む "envsubstコマンドでシェル変数を環境変数で展開する方法|テンプレートファイルの動的生成と実務活用も"
timeoutコマンドで制限時間付きでコマンドを実行する方法|ハングアップ対策とシェルスクリプト活用も
サーバー運用をしていると、ネットワーク遅延やデッドロックでコマンドがハングアップするケースは珍しくありません。特に cron から定期実行しているスクリプトは、一度ハングすると次の実行が積み上がり、リソースを食い潰す事態になります。
この記事では、timeout コマンドを使って制限時間付きでコマンドを実行する方法を解説します。
シェルスクリプトでのタイムアウト処理、終了コードの読み方、バックグラウンドプロセスへの対処、実務でよく使う組み合わせパターンまでカバーします。
この記事のポイント
・timeout コマンドで指定秒数を超えたプロセスを自動終了できる
・終了コード 124 で「タイムアウトによる終了」を判定できる
・--kill-after で SIGTERM の後に SIGKILL を送るダブル保険が設定できる
・パイプライン全体には bash -c でラップしてタイムアウトをかける
trapコマンドでbashスクリプトのシグナルを捕捉・処理する方法|一時ファイル削除やエラー終了処理の実践例も
そういった経験をしたサーバー管理者は多いはずです。
bashスクリプトで本番運用をしていると、途中終了・割り込み・エラー時のクリーンアップは避けて通れません。一時ファイルやロックファイルを作るスクリプトが不意に中断されると、次回実行時に「古いロックファイルが残っている」「tmpディレクトリが膨らんでいる」という問題が起きます。
この記事では、bashの組み込みコマンド
trap を使ったシグナルの捕捉と後処理の方法を解説します。一時ファイルの自動削除、エラー時の強制終了処理、複数シグナルへの対応まで、RHEL 9.4 / Ubuntu 24.04 LTS で動作確認した手順でお伝えします。
この記事のポイント
・trap はbash組み込みコマンドでシグナル受信時に任意の処理を実行できる
・trap "rm -f /tmp/$$.lock" EXIT で終了時に一時ファイルを自動削除できる
・INT/TERM/ERRの3シグナルを押さえれば実務の9割のケースに対応できる
・trap '' SIGINT でシグナルを無視し、重要処理を割り込みから守れる
続きを読む "trapコマンドでbashスクリプトのシグナルを捕捉・処理する方法|一時ファイル削除やエラー終了処理の実践例も"
getoptsコマンドでbashスクリプトの引数を処理する方法|オプション解析と実践例も
そういう悩みを抱えているサーバー管理者は多いです。
bashスクリプトを書き始めると、最初は位置パラメータ($1、$2…)で引数を受け取ります。しかしスクリプトが育ってきて「-v(詳細表示)」「-o 出力先」「-n(ドライラン)」といったオプションが増えてくると、位置パラメータでの管理はすぐに破綻します。定義していないオプションが渡されてもエラーを出さず、サイレントに誤動作するケースも出てきます。
この記事では、bashの組み込みコマンド
getopts を使ったオプション解析の方法を解説します。基本的な1文字オプションの受け取り方から、引数付きオプション、エラー処理、デフォルト値の設計、長いオプション(--verbose)への対応まで、RHEL 9.4 / Rocky Linux 9.4 / Ubuntu 24.04 LTS で動作確認した手順でお伝えします。
この記事のポイント
・getopts は bash 組み込みのオプション解析コマンドで外部コマンド不要
・while getopts "ab:c" opt; do case $opt in で1文字オプションを処理できる
・コロン付き(b:)は引数ありオプション、$OPTARG で値を取得する
・先頭コロン(":ab:")でサイレントモードにしてエラーを自前処理できる
・shift $((OPTIND - 1)) でオプション処理後の位置引数を詰め直すのが必須
・長いオプション(--verbose)が必要なときは外部コマンド getopt に切り替える
nohupコマンドでSSH切断後もコマンドを実行し続ける方法|バックグラウンド実行とログ保存の実践例も
SSH切断と同時にコマンドが強制終了してしまうのは、端末を閉じたときにHUPシグナル(ハングアップシグナル)がプロセスに送られるためです。
この記事では、
nohup コマンドの使い方を解説します。SSHが切断されても処理を継続させる基本手順から、バックグラウンド実行の組み合わせ、出力ログの管理まで、実務で即使える内容を網羅します。この記事のポイント
・nohup コマンドで SSH 切断後もプロセスを継続実行できる
・nohup コマンド & でバックグラウンド実行と組み合わせるのが基本形
・出力は nohup.out に保存され、リダイレクトで任意ファイルに変更できる
・screen/tmux との違いと使い分けを押さえておくと現場で迷わない
typeコマンドでシェル組み込みと外部コマンドを区別する方法|whichとの違いやalias確認も
実は which が見つけられないコマンドが存在します。シェル組み込みコマンド(built-in)と呼ばれる種類です。
この記事では、
type コマンドの使い方を解説します。コマンドがシェル組み込みなのか、外部バイナリなのか、エイリアスなのかを一発で判別できるようになります。シェルスクリプトのデバッグや、予期しない動作の原因調査にも役立ちます。この記事のポイント
・type コマンドでシェル組み込み・外部コマンド・alias を即座に判別できる
・which が何も返さない場合は type で確認するのが正しい手順
・type -a で同名コマンドの全候補をまとめて確認できる
・スクリプトのデバッグや意図しない動作の原因特定に実務で頻繁に使う
シェルのオプション|bash の set コマンドで切り替える主要オプション実務集
bashのシェルオプションは40個以上あり、すべてを使いこなすのは難しいですが、実務で押さえるべきは10個ほどです。
この記事では、シェルのオプション機能を set コマンドで切り替える基本から、シェルスクリプト品質を上げる set -e / -u / -o pipefail、対話シェルで安全性を高める noclobber まで、現場で実際に使うオプションに絞って解説します。
bash 5.x / RHEL 9 / Rocky Linux 9 / Ubuntu 24.04 LTS で動作確認済みです。
この記事のポイント
・bash の set コマンドでシェルのオプションをon/offできる
・スクリプトには set -euo pipefail を入れるのが現場の標準
・対話シェルでは noclobber を有効にして上書き事故を防げる
・現在の設定一覧は set -o で確認できる
