NOC online · 24/7Longview, TX · +1 323 412 0665
KinetikatechServers · Security · Websites
JA

Linux コマンドとシェル スキル

Bash スクリプト: 「ボックス上で動作する」からプロダクションへ

Bash は、タスクが接着剤である場合にスロットを獲得します。つまり、コマンドを調整し、単純なテキストをラングリングし、完全にボックス上に留まります。その業界の評判は、アイデアではなく着地から来ています。1 つの変数が設定されていない、または 1 つのファイル名にスペースが含まれている、テストされていないパイプラインがサーバー上の cron に出荷されました。この規律は機械的で安価であり、厳密モード、引用、シェルチェック、運用担当者が後で読み取る方法のロギングの 4 つの部分で構成されています。

要点

  • すべての本格的なスクリプトは set -euo Pipefail で開きます。変数の設定を解除すると失敗し、コマンドが失敗するとスクリプトが停止し、パイプラインは表面化します。これがないと、エラーは運用環境に到達するまで黙って通過します。
  • 変数とコマンド置換を引用符で囲みます: "$var" と "$(cmd)";スペースで単語を分割するのは昔からの古典であり、一部のサイトが推奨している IFS のいじりは覚えておきたいバグです。
  • 中括弧の展開は変数の前に発生します。 CLEANUP が設定されていない場合の rm -rf "${CLEANUP:?}"/{a,b} は、意図したものとは異なる展開をし、保持するつもりだったものを削除します。 ${VAR:?} チェックは、一度学習する価値のある rm-safety のイディオムです。
  • シェルチェックはあらゆる変更にその役割を果たします。引用符で囲まれていないグロブ、到達不能なコード、およびスペースを含むファイル名を食べる 'for f in $(ls)' パターンを捕捉します。 CI で実行すると、バグが cron に到達しなくなります。
  • 一時作業とクリーンアップはペアになっています: TMP=$(mktemp -d)、トラップ 'rm -rf "$TMP"' EXIT、孤立したスクラッチ ディレクトリはなく、すべてのブランチに 'if error then delete' スプリンクルはありません。
  • 読み取りループは安全な方法です。一方、IFS= read -r -d '' f は、find -print0 を介して改行とスペースを含むファイル名を処理します。 「for f in $(ls)」はシェルチェック フラグや古いスクリプトに依然として存在するバグです。
  • 終了コードとログは運用に影響を与えます: 失敗をステージ名で標準エラー出力 (>&2) にエコーし、実際の失敗でゼロ以外で終了し、午前 3 時に実際に必要な 1 行を cron のメールまたはジャーナルに表示させます。
  • 早期にエスカレートします: JSON 解析、3 レベル以上のネスト、HTTP 呼び出し、またはステートフル ロジックは Python または awk に属します。汎用言語に変換された bash は、その評判を獲得した場所です。

現場ノート

私たちのブレース展開の痕跡: CLEANUP が設定されていない rm -rf "${CLEANUP}"/{a,b} は、意図ではなくシェルが望んだとおりに正確に展開されました。そのようなパスにはすべて ${VAR:?} ガードが設置されており、その請求を 2 回支払った人は誰もいません。

よくある質問

#!/bin/bash または #!/usr/bin/env bash?

env は、bash が他の場所に存在するコンテナーおよび macOS インストール全体で優先されます。 set -euo Pipefail が実際に存在し、シェルチェックがすべての変更を渡すことよりも、シバンは重要ではありません。

私のスクリプトは手動で動作しますが、cron で失敗します。なぜ?

Cron はベア環境で実行されます。PATH が短く、ログイン プロファイルがなく、相対パスが間違ったホームを指しています。絶対パスを使用し、PATH を明示的に設定し、デバッグ用に bash -x のリプレイを保持します。

サーバータスクには Bash か Python?

Bash は、主に既存のシステム ツールを調整し、規模を小さくするパイプライン用です。オンコールでも存続する必要がある構造化データ、API、およびエラー処理用の Python。 bash に Python を強制的に実行させることで、インシデントに名前が付けられます。

安全に削除をスクリプト化するにはどうすればよいですか?

すべての変数を引用符で囲み、mktemp で生成されたパスまたは明示的に設定されたパスのみをターゲットにし、削除される内容を出力するドライラン モードで実行し、rm が変数を確認する前に ${VAR:?} ガードに変数の設定を解除することを拒否させます。

linux コマンドとシェル スキル に対するKinetikatechの支援

これは何百回と対応してきたケースです:管理者がサーバーを操作するかサーバーと戦うかを決定するコマンドとスクリプトの習慣。すべての基本インストールに存在するツールを使用して、テキストとプロセスを検索、変換、転送、監視します。 Linuxサーバーセキュリティとサーバー管理で、評価、実装、24時間体制の監視、そして重要な時に30分以内の対応という、完全なサイクルを提供します。

エンジニアに相談する

サーバーの障害?サイトの改ざん?表示が遅い?

重大な障害には30分以内に対応 — 24時間365日体制です。

緊急サポートを依頼する support@kinetikatech.com