メインコンテンツまでスキップ

Linux

logrotateの処理順

  1. firstaction/endscriptの実行
  2. ローテーション済みファイルのローテーション
    (例:test.1.gz->test.2.gz)
  3. prerotate/endscriptの実行
  4. 対象ファイルのローテーション(例:test->test.1)
  5. postrotate/endscriptの実行
  6. ファイルの圧縮(例:test.1->test.1.gz)
  7. preremove/endscriptの実行※
  8. 圧縮元ファイルの削除(例:test.1の削除)※
  9. preremove/endscriptの実行※
  10. 期限切れファイルの削除(例:test.3.gzの削除)※
  11. lastaction/endscriptの実行

※preremoveはローテーション対象ファイル数分、繰り返し実行される。

検証記事はブログ


anacron によるジョブの実行時刻について

anacronはcronにより、1時間に1回起動される。
(/etc/cron.hourly/0anacronにより、デフォルトでは毎時1分に起動される)

設定ファイルは以下である。
/etc/anacrontab

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

# period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.daily nice run-parts /etc/cron.weekly
@monthly 45 cron.daily nice run-parts /etc/cron.monthly

anacronが起動された際に、以下の様に、ジョブの実行時刻を決定する。

ジョブの実行時刻 = anacronの起動時刻 + ランダム遅延時間 + ジョブ固有の遅延時間
 ジョブの実行時刻がジョブの実行時間範囲内である場合、実行される。
 ジョブの実行時刻がジョブの実行時間範囲内でない場合、スキップされる。

  • ランダム遅延時間 = RANDOM_DELAY
  • ジョブ固有の遅延時間 = delay in minutes
  • ジョブの実行時間範囲 = START_HOURS_RANGE

また、ジョブの実行時刻が1時間以上後の場合、次回のジョブがスキップされる。
以下にanacronの動作例を記載する。

  1. 02:01にanacronが起動
    RANDOM_DELAY = 40であったとする。

    cron.daily
    02:01 + ランダム遅延時間(40min) + ジョブ固有の遅延時間(5min) = 02:46
    ジョブの実行時間範囲外であるため、実行されない

    cron.weekly
    02:01 + ランダム遅延時間(40min) + ジョブ固有の遅延時間(25min) = 03:06
    ジョブの実行時間範囲内であるため、実行される。

    cron.monthly
    02:01 + ランダム遅延時間(40min) + ジョブ固有の遅延時間(45min) = 03:26
    ジョブの実行時間範囲内であるため、実行される。

  2. 03:01にanacronが起動
    02:01に起動したanacronのジョブ実行時刻が03:01以降であるため、
    ジョブ実行履歴ファイル(/var/spool/anacron/cron.*)をロックし続けており、スキップされる。

  3. 03:06 にcron.weeklyジョブが実行される。

  4. 03:26 にcron.monthlyジョブが実行される。

  5. 04:01にanacronが起動
    RANDOM_DELAY = 15であったとする。

    cron.daily
    04:01 + ランダム遅延時間(15min) + ジョブ固有の遅延時間(5min) = 04:21
    ジョブの実行時間範囲内であるため、実行される。

    cron.weekly
    本日既に実行されているため、実行されない。

    cron.monthly
    本日既に実行されているため、実行されない。

  6. 04:21 にcron.dailyジョブが実行される。

  7. 05:01にanacronが起動
    本日既にすべてのジョブが実行されているため、何も実行されない。

参考URL


ulimitと自動起動設定について

/etc/security/limits.confにおいて、ulimitを設定しても、
OSの自動起動によってプロセスが起動された場合、ulimitが適用されない。
(ulimitとは、PAM認証を通ったユーザへのリソース設定であるため)

起動方式によって、以下の様な対応をする。

  • Systemd方式
    サービスに設定する
    /etc/systemd/system/<サービス名>
\[Service]
LimitNOFILE=64000
LimitNPROC=16000
LimitDATA=8000000000
  • SysVinit方式
    起動スクリプトにulimitを設定する。
    /etc/init.d/<プロセス名>
  ulimit -n 64000  
ulimit -u 16000
ulimit -d 8000000000

ファイルのタイムスタンプ

Unix系のシステムは、ファイルのタイムスタンプが以下の三つある。

タイムスタンプ名称概要ls による確認方法
atimeaccess time最後にファイルにアクセスした時間ls -lu
ctimechange time最後にinodeが更新された時間(ファイル内容もしくは属性が更新された場合)ls -lc
mtimemodify time最後にファイル内容が更新された時間ls -l

stat コマンドを用いればファイルの属性をすべて確認できる。