はじめに
「/var/log/messages」を所定の時間にログローテーションするbashスクリプトを作成し、「crontab」に仕込む。
環境
CentOS 7.9.2009
# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) #
手順
1.bashスクリプトの作成
2.crontab設定
3.ジョブ動作テスト
※今回は個人の検証環境のため、「rootユーザー」にて実施しております。
1.bashスクリプトの作成
①ログ保存用ディレクトリ作成
ログ保存用のディレクトリを作成する。
mkdir -p /var/log/syslog
ディレクトリが作成できたことを確認。
[root@test syslog]# ls -la 合計 4 drwxr-xr-x. 2 root root 6 9月 18 18:41 . drwxr-xr-x. 9 root root 4096 9月 18 18:41 .. [root@test syslog]#
②bashスクリプト格納用ディレクトリ作成
bashスクリプト格納用のディレクトリを作成する。
※bashスクリプトのログ保存先も含めて作成。
mkdir -p /root/script/log
ディレクトリが作成できたことを確認。
[root@test ~]# ls -la /root/script/log 合計 0 drwxr-xr-x. 2 root root 6 2月 5 12:48 . drwxr-xr-x. 3 root root 42 2月 5 12:43 .. [root@test ~]#
作成したディレクトリに移動する。
cd /root/script
③bashスクリプト作成
/root/script 配下に logrotate-test.sh を作成
vi /root/script/logrotate-test.sh
#!/bin/sh #「/var/log/messages」をログローテーションするスクリプト # 日時取得 data=`date "+%Y%m%d_%H%M%S"` # ログ取得設定 LOGFILE=/root/script/log/logrotate-test_${data}.log exec >> ${LOGFILE} 2>&1 # ログローテート処理 if [ -e /var/log/messages ]; then # 「/var/log/messages」ファイルを「/var/log/syslog」へ移動 mv /var/log/messages /var/log/syslog/messages_${data} # 新しい「/var/log/messages」ファイルを作成 touch /var/log/messages # 移動したログファイルを圧縮 zip -j /var/log/syslog/messages_${data}.zip /var/log/syslog/messages_${data} # 移動したログファイルを削除 rm -f /var/log/syslog/messages_${data} else # 新しい「/var/log/messages」ファイルを作成 touch /var/log/messages # スクリプトの終了 exit fi
補足 : execについて
ログ取得設定の記述について
ログ取得設定の部分に以下のような記述があります。
exec >> ${LOGFILE} 2>&1
これは、スクリプトの実行結果を指定したログファイルに入力するための処理になります。
2>&1 は、標準エラー出力(2)を標準出力(1)に入力するものになります。
これを記載していない場合の処理は、以下になります。
- 標準出力(1) : ファイルに記録される
- 標準エラー出力(2) : 画面に出力される
このように処理が分かれます。
要するに、標準エラー出力も標準出力と同様にファイルに出力したい場合に記載するものになります。
execを使用している理由としては、ログ出力の記載部分をスッキリさせるためになります。
execを使用していない場合は、以下のような記載になります。
command1 >> $LOGFILE 2>&1 command2 >> $LOGFILE 2>&1 command3 >> $LOGFILE 2>&1
これを回避するために、exec を使用してスッキリさせています。
以下の記事が参考になりました。
execについて
exec は、現行のジョブに置き換えてコマンドを実行するコマンドになります。
詳しくは、以下を参考下さい。
④スクリプトの権限変更
作成した`logrotate-test.sh`に対して、所有者のみに実行権限を付与する。
事前確認
所有者「root」に実行権限がないことを確認。
→「rw-」
[root@test ~]# ls -la /root/script/logrotate-test.sh -rw-r--r--. 1 root root 812 2月 5 12:49 logrotate-test.sh [root@test ~]#
権限変更
所有者「root」に実行権限を追加。
chmod u+x /root/script/logrotate-test.sh
事後確認
所有者「root」に実行権限が付与されたことを確認。
→「rwx」
[root@test ~]#ls -la /root/script/logrotate-test.sh -rwxr--r--. 1 root root 812 2月 5 12:49 /root/script/logrotate-test.sh [root@test ~]#
2.crontab設定
①crontab事前確認
以下コマンドを実行し、事前にジョブが登録されていないか確認。
crontab -l
実行例)
[root@test ~]# crontab -l no crontab for root [root@test ~]#
②crontab設定
以下コマンドを実行し、crontabの設定を実施。
crontab -e
毎日、20:00にシェルを実行するよう設定
0 20 * * * /root/script/logrotate-test.sh
※詳しい確認方法は、以下サイトを参照
③crontab事後確認
以下コマンドを実行し、設定したジョブが登録されていることを確認。
crontab -l
実行例)
[root@test ~]# crontab -l 0 20 * * * /root/script/logrotate-test.sh [root@test ~]#
3.ジョブ動作テスト
20:00以降に結果を確認する。
①ログファイル確認
・/root/script/log へ移動
cd /root/script/log
・ログが保存されていることを確認
[root@test log]# pwd /root/script/log [root@test log]# ls -la 合計 4 drwxr-xr-x. 2 root root 216 9月 19 16:47 . drwxr-xr-x. 3 root root 42 9月 18 18:57 .. -rw-r--r--. 1 root root 50 9月 19 16:47 logrotate-test_20220919_164738.log [root@test log]#
・ログファイルに処理結果が出力されていることを確認
[root@test log]# cat logrotate-test_20210205_200001.log adding: messages_20210205_200001 (deflated 81%) [root@test log]#
②新しい「/var/log/messages」が作成されていることを確認
/var/log/messages が存在することを確認。
[root@test ~]# ls -la /var/log/messages -rw-r--r--. 1 root root 0 9月 19 16:47 /var/log/messages [root@test ~]# cat /var/log/messages [root@test ~]#
③圧縮したログファイルの確認
・ /var/log/syslog へ移動
cd /var/log/syslog
・messages_yyyymmdd_hhmmss.zip が存在することを確認
[root@test ~]# cd /var/log/syslog [root@test syslog]# pwd /var/log/syslog [root@test syslog]# ls -la 合計 32 drwxr-xr-x. 2 root root 42 9月 19 17:02 . drwxr-xr-x. 9 root root 4096 9月 19 16:47 .. -rw-r--r--. 1 root root 26844 9月 19 16:47 messages_20220919_164738.zip [root@test syslog]#
・ messages_yyyymmdd_hhmmss.zip を解凍する。
unzip messages_20220919_164738.zip
実行結果)
[root@test syslog]# unzip messages_20220919_164738.zip Archive: messages_20220919_164738.zip inflating: messages_20220919_164738 [root@test syslog]#
・解凍したログファイルが存在することを確認
[root@test syslog]# ls -la 合計 148 drwxr-xr-x. 2 root root 74 9月 19 16:48 . drwxr-xr-x. 9 root root 4096 9月 19 16:47 .. -rw-r--r--. 1 root root 118182 9月 19 16:43 messages_20220919_164738 -rw-r--r--. 1 root root 26844 9月 19 16:47 messages_20220919_164738.zip [root@test syslog]#
・ファイルの内容を確認
ログがローテーションできていることを確認。
[root@test syslog]# tail messages_20220919_164738 Sep 19 16:42:18 test systemd: Started Crash recovery kernel arming. Sep 19 16:42:18 test systemd: Startup finished in 492ms (kernel) + 2.196s (initrd) + 6.694s (userspace) = 9.383s. Sep 19 16:42:20 test chronyd[659]: Selected source 194.0.5.123 Sep 19 16:42:20 test chronyd[659]: System clock wrong by 1.320240 seconds, adjustment started Sep 19 16:42:20 test chronyd[659]: System clock was stepped by 1.320240 seconds Sep 19 16:42:20 test systemd: Time has been changed Sep 19 16:43:00 test systemd: Created slice User Slice of auser. Sep 19 16:43:00 test systemd: Started Session 1 of user auser. Sep 19 16:43:00 test systemd-logind: New session 1 of user auser. Sep 19 16:43:26 test chronyd[659]: Selected source 202.181.103.212 [root@test syslog]#
さいごに
今回bashスクリプトに初挑戦してみました。
※業務ではPowerShellスクリプトの経験があります。
実際にbashスクリプトを書いてみて、PowerShellスクリプトと違うところがあると感じました。
しかし、慣れれば書けるという印象です。
これからもスクリプト系等、技術系の記事を投稿していきたいと思います!
・YouTube