シェルスクリプトを使用したLinuxシステムメンテナンスタスクの自動化-パート4


少し前に、効果的なシステム管理者/エンジニアの際立った特徴の1つが怠惰であることを読みました。最初は少し矛盾しているように見えましたが、著者は次に理由を説明しました。

システム管理者が問題の解決と反復的なタスクの実行にほとんどの時間を費やしている場合は、システム管理者が正しく機能していない可能性があります。言い換えれば、効果的なシステム管理者/エンジニアは、自分の側でのアクションをできるだけ少なくして反復的なタスクを実行する計画を立て、次を使用して問題を予測する必要があります。

たとえば、パート3 –このシリーズのLinuxツールセットを使用したシステムアクティビティレポートの監視で確認したツール。したがって、彼または彼女はあまりやっていないように見えるかもしれませんが、それは彼/彼女の責任のほとんどがシェルスクリプトの助けを借りて処理されているためです。これはこのチュートリアルで説明します。

シェルスクリプトとは何ですか?

簡単に言うと、シェルスクリプトは、Linuxカーネルとエンドユーザーの間にインターフェイスレイヤーを提供する別のプログラムであるシェルによって段階的に実行されるプログラムに他なりません。

デフォルトでは、RHEL 7のユーザーアカウントに使用されるシェルはbash(/ bin/bash)です。詳細な説明と歴史的背景が必要な場合は、このウィキペディアの記事を参照してください。

このシェルが提供する膨大な機能セットの詳細については、(Bashコマンド)でPDF形式でダウンロードされているmanページを確認してください。それ以外は、Linuxコマンドに精通していることを前提としています(そうでない場合は、先に進む前に、Tecmint.comの「初心者からSysAdminへのガイド」の記事を読むことを強くお勧めします)。それでは始めましょう。

システム情報を表示するスクリプトの作成

便宜上、シェルスクリプトを格納するディレクトリを作成しましょう。

# mkdir scripts
# cd scripts

そして、お好みのテキストエディタで system_info.sh という名前の新しいテキストファイルを開きます。まず、上部にいくつかのコメントを挿入し、その後にいくつかのコマンドを挿入します。

#!/bin/bash

# Sample script written for Part 4 of the RHCE series
# This script will return the following set of system information:
# -Hostname information:
echo -e "\e[31;43m***** HOSTNAME INFORMATION *****\e[0m"
hostnamectl
echo ""
# -File system disk space usage:
echo -e "\e[31;43m***** FILE SYSTEM DISK SPACE USAGE *****\e[0m"
df -h
echo ""
# -Free and used memory in the system:
echo -e "\e[31;43m ***** FREE AND USED MEMORY *****\e[0m"
free
echo ""
# -System uptime and load:
echo -e "\e[31;43m***** SYSTEM UPTIME AND LOAD *****\e[0m"
uptime
echo ""
# -Logged-in users:
echo -e "\e[31;43m***** CURRENTLY LOGGED-IN USERS *****\e[0m"
who
echo ""
# -Top 5 processes as far as memory usage is concerned
echo -e "\e[31;43m***** TOP 5 MEMORY-CONSUMING PROCESSES *****\e[0m"
ps -eo %mem,%cpu,comm --sort=-%mem | head -n 6
echo ""
echo -e "\e[1;32mDone.\e[0m"

次に、スクリプトに実行権限を付与します。

# chmod +x system_info.sh

そしてそれを実行します:

./system_info.sh

視覚化を向上させるために、各セクションのヘッダーはカラーで表示されていることに注意してください。

その機能は、次のコマンドによって提供されます。

echo -e "\e[COLOR1;COLOR2m<YOUR TEXT HERE>\e[0m"

ここで、COLOR1とCOLOR2はそれぞれ前景色と背景色であり(詳細とオプションはArch Linux Wikiのこのエントリで説明されています)、はカラーで表示する文字列です。

タスクの自動化

自動化する必要のあるタスクは、ケースごとに異なる場合があります。したがって、1つの記事で考えられるすべてのシナリオを網羅することはできませんが、シェルスクリプトを使用して自動化できる3つの古典的なタスクを紹介します。

1)ローカルファイルデータベースを更新し、2)777権限を持つファイルを検索(または削除)し、3)ファイルシステムの使用量が定義された制限を超えたときにアラートを出します。

次の内容の auto_tasks.sh という名前のファイルをscriptsディレクトリに作成しましょう。

#!/bin/bash

# Sample script to automate tasks:
# -Update local file database:
echo -e "\e[4;32mUPDATING LOCAL FILE DATABASE\e[0m"
updatedb
if [ $? == 0 ]; then
        echo "The local file database was updated correctly."
else
        echo "The local file database was not updated correctly."
fi
echo ""

# -Find and / or delete files with 777 permissions.
echo -e "\e[4;32mLOOKING FOR FILES WITH 777 PERMISSIONS\e[0m"
# Enable either option (comment out the other line), but not both.
# Option 1: Delete files without prompting for confirmation. Assumes GNU version of find.
#find -type f -perm 0777 -delete
# Option 2: Ask for confirmation before deleting files. More portable across systems.
find -type f -perm 0777 -exec rm -i {} +;
echo ""
# -Alert when file system usage surpasses a defined limit 
echo -e "\e[4;32mCHECKING FILE SYSTEM USAGE\e[0m"
THRESHOLD=30
while read line; do
        # This variable stores the file system path as a string
        FILESYSTEM=$(echo $line | awk '{print $1}')
        # This variable stores the use percentage (XX%)
        PERCENTAGE=$(echo $line | awk '{print $5}')
        # Use percentage without the % sign.
        USAGE=${PERCENTAGE%?}
        if [ $USAGE -gt $THRESHOLD ]; then
                echo "The remaining available space in $FILESYSTEM is critically low. Used: $PERCENTAGE"
        fi
done < <(df -h --total | grep -vi filesystem)

スクリプトの最後の行の2つの <記号の間にスペースがあることに注意してください。

cronの使用

効率をさらに一歩上げるために、コンピューターの前に座ってそれらのスクリプトを手動で実行することは望ましくありません。むしろ、cronを使用して、これらのタスクを定期的に実行するようにスケジュールし、結果を事前定義された受信者のリストに電子メールで送信するか、Webブラウザーを使用して表示できるファイルに保存します。

次のスクリプト(filesystem_usage.sh)は、よく知られているdf -hコマンドを実行し、出力をHTMLテーブルにフォーマットして、report.htmlファイルに保存します。

#!/bin/bash
# Sample script to demonstrate the creation of an HTML report using shell scripting
# Web directory
WEB_DIR=/var/www/html
# A little CSS and table layout to make the report look a little nicer
echo "<HTML>
<HEAD>
<style>
.titulo{font-size: 1em; color: white; background:#0863CE; padding: 0.1em 0.2em;}
table
{
border-collapse:collapse;
}
table, td, th
{
border:1px solid black;
}
</style>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
</HEAD>
<BODY>" > $WEB_DIR/report.html
# View hostname and insert it at the top of the html body
HOST=$(hostname)
echo "Filesystem usage for host <strong>$HOST</strong><br>
Last updated: <strong>$(date)</strong><br><br>
<table border='1'>
<tr><th class='titulo'>Filesystem</td>
<th class='titulo'>Size</td>
<th class='titulo'>Use %</td>
</tr>" >> $WEB_DIR/report.html
# Read the output of df -h line by line
while read line; do
echo "<tr><td align='center'>" >> $WEB_DIR/report.html
echo $line | awk '{print $1}' >> $WEB_DIR/report.html
echo "</td><td align='center'>" >> $WEB_DIR/report.html
echo $line | awk '{print $2}' >> $WEB_DIR/report.html
echo "</td><td align='center'>" >> $WEB_DIR/report.html
echo $line | awk '{print $5}' >> $WEB_DIR/report.html
echo "</td></tr>" >> $WEB_DIR/report.html
done < <(df -h | grep -vi filesystem)
echo "</table></BODY></HTML>" >> $WEB_DIR/report.html

RHEL 7サーバー(192.168.0.18)では、これは次のようになります。

そのレポートに必要なだけの情報を追加できます。毎日午後1時30分にスクリプトを実行するには、次のcrontabエントリを追加します。

30 13 * * * /root/scripts/filesystem_usage.sh

概要

自動化する必要がある、または自動化する必要のある他のいくつかのタスクについて考える可能性があります。ご覧のとおり、シェルスクリプトを使用すると、この作業が大幅に簡素化されます。この記事が役に立ったら、お気軽にお知らせください。下のフォームから、お気軽にアイデアやコメントを追加してください。