Skip to content

topコマンドの実行結果ログを出力する

はじめに

CPU使用率が高いプロセスを特定するために、topコマンドの出力を定期的に取得したい。

  • 以下の設定ファイルを作成していきます。

    • topコマンドの出力を保存する為のログ・ファイル
      /var/log/toplog/toplog

    • topコマンドを定期的に実行するcronの設定ファイル
      /etc/cron.d/toplog

    • topコマンドの出力ログを定期的にローテションする為の設定ファイル
      /etc/logrotate.d/toplog


設定手順 1. 「toplog」ディレクトリの作成

実際に、topコマンドのログを保存していくディレクトリを作成します。
mkdir /var/log/toplog/


設定手順 2. cronファイルの作成

cron.dディレクトリ配下に、クローンを実行する設定ファイル「toplog」を新規作成します。
vi /etc/cron.d/toplog

  */5 * * * * root /bin/date >> /var/log/toplog/toplog; /usr/bin/top -b -n 10 -d 30 >> /var/log/toplog/toplog
  • 設定内容について
    • topコマンドを30秒間隔で10回実行する(topコマンドを 5分間実行する)ことを、cronで5分毎に実行する。
    • topコマンド実行前に、dateコマンドで日付取得。
    • ログの出力先ファイルは、「/var/log/toplog/toplog」


設定手順 3. ローテション設定ファイルの作成

/var/log/toplog/ディレクトリ配下に作成されるログファイルのtoplogを、ローテションする設定を作成します。

vi /etc/logrotate.d/toplog

/var/log/toplog/toplog {  
missingok
dateformat _%Y-%m-%d
dateext
daily
compress
rotate 30          
postrotate
 /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
  • 各項目の設定内容については、以下をご参考ください。

    記載内容 効果
    missingok ログファイルが存在しなくてもエラーを出さずに処理を続行する
    dateformat _%Y-%m-%d ファイルをローテションする際に、古いファイルの末尾に付ける日付のフォーマットを設定する。今回の場合は、ファイル末尾が例えば「_2020-02-02」の形になる。
    dateext ファイルをローテションする際に、古いファイルの末尾に日付8桁(-YYYYMMDD)を付ける。
    daily 日次でローテションを実行。週次でローテション を設定する場合は、「weekly」。月次でローテションを設 定する場合、「monthly」。
    compress ローテションしたファイルをgzで圧縮。(解凍 は、gunzipコマンド)
    rotate 30 保存する世代数を指定する。今回の例では、 30世代(約1か月分)を保存している。
    postrotate ~ endscript ローテション実行後に~内 のコマンドを実行する。
    /bin/kill -HUP cat /var/run/syslogd.pid 2> / dev/null 2> /dev/null true ローテート後に syslogを再起動する。(この設定はコピペでOK。)
  • 上記設定内容の注意点

    • 「dateext」無しで「deteformat」だけ指定すると、 dateformatが効かないので注意。

    • 「missingok」が無いと、ファイルがない場合にエラー を吐いて終了する

    • 「cat /var/run/syslogd.pid 2> /dev/null` 2> / dev/null || true」が無いとローテション後のログファ イルに書き込めなくなることがあるらしい。

    • 以下のように米印でコメントアウト行を追加することも できるが、上手くローテションされない原因になる場合も あるので省いたほうが無難。

      /var/log/toplog/toplog {  
      daily              # コメント行
      compress           # コメント行
      rotate 30          # コメント行
      }


設定手順 4. ログ・ローテション実行の設定確認

  • ログ・ローテションのテスト(ドライラン)を実行する。 (実際にはログのローテションはされません。)
    logrotate -dv /etc/logrotate.d/toplog

    • 成功例の出力

      reading config file /etc/logrotate.d/toplog
      Allocating hash table for state file, size     15360 B
      Handling 1 logs
      rotating pattern: /var/log/toplog/toplog    after   1 days (30 rotations)
      empty log files are rotated, old logs are     removed
      considering log /var/log/toplog/toplog
      log does not need rotating (log has been     already rotated)
    • エラーになっている例
      (以下のエラーは、rotate 項目の後にコメントアウト文言を入れた為エラーになっている。)

    reading config file /etc/logrotate.d/toplog
    error: /etc/logrotate.d/toplog:7 bad rotation     count '30          # 30世代(約1か月分)保存'
    error: found error in /var/log/toplog/toplog ,     skipping
    removing last 1 log configs
    Allocating hash table for state file, size     15360 B
    
    Handling 0 logs


その他備考:

  • ログを強制的にローテションする方法。
    logrotate -f /etc/logrotate.d/toplog

    • ログ保存ディレクトリにローテションされたログファイルが作成されればOK.
      [root@centos]# ls -l /var/log/toplog/  
      total 24
      -rw-r--r-- 1 root root 23596 Apr  6 16:49 toplog_2020-04-06.gz
    • なお、上記のように「logrotate -f」コマンド実行時にlogrotate.d配下のファイルを直接指定して実行した場合、logrotate.confに書いた設定内容は反映されません。


ローテションが上手くいかないときの対処

ローテションが上手くいかない原因は、様々な要因が考えられる為、ローテションの動作を理解して各設定を確認していきましょう。

ローテションを実行するlogrotateコマンドは、cronから起動され、順次設定ファイルが読み込まれていきます。

  • 動作1: cronのlogrotegが実行される。
    対象: /etc/cron.daily/logrotate

  • 動作2: logrotateの設定ファイルが読み込まれる
    対象: /etc/logrotate.conf

  • 動作3: /etc/logrotate.conf が各設定ファイルを読み込む
    対象: /etc/logrotate.d/ 配下にある各ファイル

ローテーションが設定どおりに動作しているかをログから確認できます。

  • cronのログ
    /var/log/cron

  • 最後にログローテションが実行された日時が記載されているログ
    /var/lib/logrotate/logrotate.status
    (あるいは、/var/lib/logrotate.status)

実際にあった原因・解決策

  • /etc/logrotate.confの設定ファイルが無かった/消されていた。
  • logrotateのプロセスが残っていた。
  • /etc/logrotate.d/ 配下にある各ログ個別の設定ファイルに全角文字列が入っていた。あるいは、全角スペースが入っていた。
  • 一度、「logrotate -f」コマンドを使って強制的にローテションを行ったら次回から正常に動作した。

参考サイト

https://users.miraclelinux.com/support/?q=node/218
https://qiita.com/Esfahan/items/a8058f1eb593170855a1
https://qiita.com/zom/items/c72c7bac63462225971b
https://open-groove.net/linux/logrotate-test/
https://www.atmarkit.co.jp/flinux/rensai/linuxtips/747logrotatecmd.html

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA