ウェブサイト検索

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


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

システム管理者が問題の解決や反復的なタスクの実行にほとんどの時間を費やしている場合、そのシステム管理者が物事を完全に正しく行っていないのではないかと疑うことができます。言い換えれば、有能なシステム管理者/エンジニアは、自分のアクションをできるだけ少なくして反復的なタスクを実行する計画を立て、以下を使用して問題を予測する必要があります。

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

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

一言で言えば、シェル スクリプトは、シェルによって段階的に実行されるプログラム以外の何ものでもありません。シェルは、Linux カーネルとエンド ユーザーの間にインターフェイス層を提供する別のプログラムです。

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

このシェルが提供する膨大な機能セットの詳細については、(Bash コマンド) から PDF 形式でダウンロードできるそのマニュアル ページを確認してください。それ以外は、Linux コマンドに精通していることが前提となります (そうでない場合は、続行する前にlinux-console.net の「初心者から 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"

ここで、COLOR1COLOR2 はそれぞれ前景色と背景色です (詳細とオプションについては、Arch Linux Wiki のこのエントリで説明されています) と は色で表示したい文字列です。

タスクの自動化

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

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

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


#!/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 を使用してこれらのタスクを定期的に実行するようにスケジュールし、結果を事前に定義された受信者のリストに電子メールで送信するか、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

まとめ

おそらく、自動化したい、または自動化する必要がある他のタスクがいくつか思い浮かぶでしょう。ご覧のとおり、シェル スクリプトを使用すると、この作業が大幅に簡素化されます。この記事が役に立ったと思われる場合は、お気軽にお知らせください。以下のフォームからご自身のアイデアやコメントを遠慮なく追加してください。