ラズパイで作る自宅WEBサーバ構築
第11回 crontab 設定 2019.11.25 / 2021.07.30更新
今回は crontab の設定です。
YouTube 動画でポイントを説明しています。上記画像をクリックすると再生できます。
システム関連のログファイルは放置しておくと、膨大なサイズに膨れ上がります。
ログファイルを世代管理することにより、ファイルサイズを抑えるとともに、ログの可読性を高めます。
世代管理を行うには、logrotate を用います。まずは、crontab を利用して、このlogroateが定期的に起動するように設定します。
ubuntu 18.04 Server では、logrotate は標準でインストールされています。
$ dpkg --get-selections | grep logrotate
logrotate install
$ logrotate --version
logrotate 3.11.0
WEBサーバーとメールサーバーを構築し、数週間経過後に、/var/log/mail.log などをみてみましょう。
mail.log のファイルサイズは肥大化していて、しかも、mail.log.1 などのバックアップファイルが生成されていないことに気づきます。
$ ls -l /var/log
total 61256
drwxr-x--- 5 root adm 4096 7月 22 06:25 apache2
drwxr-xr-x 2 root root 4096 7月 22 06:08 apt
-rw-r----- 1 syslog adm 26098 7月 22 11:26 auth.log
-rw-rw---- 1 root utmp 0 7月 22 06:25 btmp
-rw-r--r-- 1 syslog adm 5380978 7月 22 18:36 cloud-init.log
drwxr-xr-x 2 root root 4096 7月 22 2019 dist-upgrade
-rw-r--r-- 1 root root 38083 7月 22 06:09 dpkg.log
-rw-r----- 1 syslog adm 0 7月 22 06:25 kern.log
-rw-rw-r-- 1 root utmp 297184 7月 22 11:27 lastlog
drwxr-xr-x 2 root root 4096 7月 22 2018 lxd
-rw-r----- 1 syslog adm 0 7月 22 06:25 mail.err
-rw-r----- 1 syslog adm 6085315 7月 22 11:26 mail.log
drwxr-x--- 2 mysql adm 4096 7月 22 06:25 mysql
-rw-r----- 1 syslog adm 179234 7月 22 11:26 syslog
-rw------- 1 root root 64256 7月 22 10:38 tallylog
-rw-rw-r-- 1 root utmp 21200 7月 22 11:27 wtmp
※表示内容は抜粋・編集しています
各種ログ・ファイルを最後にログローテーションした日付が記述されている履歴ファイルを覗いてみます。
$ cat /var/lib/logrotate/status ← Debian/Ubuntuの場合の履歴ファイル
cat: /var/lib/logrotate/status: No such file or directory
ファイルそのものが存在しません。
ubuntu-20.04.2-server の場合は、システムをインストールするとすぐに、logrotateが実施されるようです。
logrotate state -- version 2
"/var/log/syslog" 2021-7-30-0:0:28
"/var/log/dpkg.log" 2021-7-29-9:0:0
"/var/log/unattended-upgrades/unattended-upgrades.log" 2021-7-29-9:0:0
"/var/log/unattended-upgrades/unattended-upgrades-shutdown.log" 2021-7-29-9:0:0
"/var/log/auth.log" 2021-7-29-9:0:0
"/var/log/apt/term.log" 2021-7-29-9:0:0
"/var/log/apport.log" 2021-7-29-9:0:0
"/var/log/apt/history.log" 2021-7-29-9:0:0
"/var/log/mysql/error.log" 2021-7-30-0:0:0
"/var/log/boot.log" 2021-7-30-0:0:28
"/var/log/alternatives.log" 2021-7-29-9:0:0
"/var/log/mail.log" 2021-7-29-9:0:0
"/var/log/debug" 2021-7-29-9:0:0
"/var/log/kern.log" 2021-7-29-9:0:0
"/var/log/mysql.log" 2021-7-30-0:0:0
"/var/log/apache2/access.log" 2021-7-30-0:0:0
"/var/log/ufw.log" 2021-7-29-9:0:0
"/var/log/daemon.log" 2021-7-29-9:0:0
"/var/log/wtmp" 2021-7-29-9:0:0
"/var/log/mail.warn" 2021-7-29-9:0:0
"/var/log/ubuntu-advantage.log" 2021-7-29-9:0:0
"/var/log/btmp" 2021-7-29-9:0:0
"/var/log/mail.err" 2021-7-29-9:0:0
"/var/log/lpr.log" 2021-7-29-9:0:0
"/var/log/unattended-upgrades/unattended-upgrades-dpkg.log" 2021-7-29-9:0:0
"/var/log/user.log" 2021-7-29-9:0:0
"/var/log/mail.info" 2021-7-29-9:0:0
"/var/log/apache2/other_vhosts_access.log" 2021-7-30-0:0:0
"/var/log/apache2/error.log" 2021-7-30-0:0:0
"/var/log/cron.log" 2021-7-29-9:0:0
"/var/log/messages" 2021-7-29-9:0:0
各サービスごとの設定ファイルを確認します。
$ ls /etc/logrotate.d
alternatives apache2 apport apt dpkg lxd mysql-server ppp rsyslog ufw unattended-upgrades
この中の、rsyslog 設定ファイルをみてみます。rsyslogはサーバ上のさまざまなログ収集を行うソフトウェアです。
$ cat /etc/logrotate.d/rsyslog
/var/log/syslog
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
rotate 4
weekly
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
maillogなどが1週間で肥大化するようなら、5MBになったら強制的に世代を移すようにすることも可能です。
......
rotate 4
weekly
size 5M ← 追記
missingok
......
次に、logrotate のメイン設定ファイルを確認しておきます。
$ cat /etc/logrotate.conf
.....
include /etc/logroate.d
.....
logrotate.d 配下の各サービス設定ファイルが読み込まれることがわかります。
logrotate を -dを付けてdry-run(仮実行)して結果を見てみましょう。
$ sudo logrotate -dv /etc/logrotate.conf
ローテートする条件を満たしていなくても強制的に実行させてみます。
$ sudo logrotate -f /etc/logrotate.conf
$ cat /var/lib/logrotate/status
logrotate state -- version 2
"/var/log/syslog" 2019-07-22-21:52:58
"/var/log/dpkg.log" 2019-07-22-21:52:58
"/var/log/unattended-upgrades/unattended-upgrades.log" ...
"/var/log/unattended-upgrades/unattended-upgrades-shutdown.log" ...
"/var/log/auth.log" 2019-07-22-21:52:58
"/var/log/apt/term.log" 2019-07-22-21:52:58
"/var/log/ppp-connect-errors" 2019-07-22-21:0:0
"/var/log/apport.log" 2019-07-22-21:0:0
"/var/log/apt/history.log" 2019-07-22-21:52:58
"/var/log/mysql/error.log" 2019-07-22-21:52:58
"/var/log/alternatives.log" 2019-07-22-21:52:58
"/var/log/debug" 2019-07-22-21:0:0
"/var/log/mail.log" 2019-07-22-21:52:58
"/var/log/kern.log" 2019-07-22-21:52:58
"/var/log/mysql.log" 2019-07-22-21:0:0
"/var/log/apache2/access.log" 2019-07-22-21:0:0
"/var/log/ufw.log" 2019-07-22-21:0:0
"/var/log/wtmp" 2019-07-22-21:52:58
"/var/log/daemon.log" 2019-07-22-21:0:0
"/var/log/mail.warn" 2019-07-22-21:0:0
"/var/log/btmp" 2019-07-22-21:52:58
"/var/log/lpr.log" 2019-07-22-21:0:0
"/var/log/mail.err" 2019-07-22-21:52:58
"/var/log/unattended-upgrades/unattended-upgrades-dpkg.log" ...
"/var/log/user.log" 2019-07-22-21:0:0
"/var/log/mail.info" 2019-07-22-21:0:0
"/var/log/lxd/lxd.log" 2019-07-22-21:0:0
"/var/log/apache2/other_vhosts_access.log" 2019-07-22-21:0:0
"/var/log/apache2/error.log" 2019-07-22-21:52:58
"/var/log/cron.log" 2019-07-22-21:0:0
"/var/log/messages" 2019-07-22-21:0:0
次に、logrotateが動くタイミングを確認します。
$ ls /etc/cron*
/etc/crontab
/etc/cron.d:
mdadm php popularity-contest
/etc/cron.daily:
apache2 apt-compat dpkg man-db mlocate popularity-contest update-notifier-common
apport bsdmainutils logrotate mdadm passwd ubuntu-advantage-tools
/etc/cron.hourly:
/etc/cron.monthly:
/etc/cron.weekly:
man-db update-notifier-common
/etc/cron.daily に logrotate があります。
一応、スクリプトの内容をみてみます。
$ cat /etc/cron.daily/logrotate
#!/bin/sh
# Clean non existent log file entries from status file
cd /var/lib/logrotate
test -e status || touch status
head -1 status > status.clean
sed 's/"//g' status | while read logfile date
do
[ -e "$logfile" ] && echo "\"$logfile\" $date"
done >> status.clean
mv status.clean status
test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf
次に、crontab 設定をみてみると、毎日実行される /etc/cron.daily のスクリプトがコメントアウトされています。
$ cat /etc/crontab
......
# 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
......
※ubuntu-20.04.2-server の場合はコメントアウトされていません。
コメントを外して書き換えます。
$ sudo vi /etc/crontab
25 6 * * * root cd / && run-parts --report /etc/cron.daily
crontabとanacronは、動くタイミングが違います。
・crontab…指定された時間にマシンが落ちていたら何もしない
・anacron…マシンが落ちていたら次に起動した時に実行する
今回は anacron は実装しません。
サービスを再起動して、設定を反映させましょう。
$ sudo service cron restart
$ ls -l /var/log/mail.log.*
-rw-r----- 1 syslog adm 85315 11月 25 11:26 mail.log
-rw-r----- 1 syslog adm 4969315 11月 25 06:23 mail.log.1
-rw-r----- 1 syslog adm 422458 11月 17 06:24 mail.log.2.gz
-rw-r----- 1 syslog adm 499940 11月 11 06:24 mail.log.3.gz
-rw-r----- 1 syslog adm 404448 11月 3 06:25 mail.log.4.gz
しばらくすると、1週間ごとにログローテートされ、4世代管理されているのがわかります。また、2世代目以降はファイルが圧縮されています。
次に、MySQLデータベースを1日ごとにバックアップを取りましょう。
まずは、MySQLのデータをバックアップするスクリプトを書いてみます
$ vi /home/ubuntu/scripts/dailybackup.sh
#!/bin/bash
set `date +%y%m%d`
/usr/bin/mysqldump --user=[mysqluser] --password=[mysqlpasswd] --databases [databasename] | gzip > backup.dmp.gz
mv /root/backup.dmp.gz /home/ubuntu/logs/backup.dump_$1.gz
chown ubuntu.ubuntu /home/ubuntu/logs/backup.dump_$1.gz
[mysqluser],[mysqlpasswd],[databasename]は自分で設定した名称に置き換えてください。'[]'は不要です。
また、Windows環境で作ったシェルスクリプトを ubuntu サーバに転送する際には注意が必要です。
私の使っているテキストエディタは改行コードをLF(0x0a)に設定できますが、メモ帳などでは LFCR(0x0a0d)になってしまいます。これを実行すると
/bin/bash^M: bad interpreter: No such file or directory
のようなエラーメッセージが表示されます。
ubuntu サーバ側で改行コードを変更するには sed コマンドを実行します。
$ sed -i 's/\r//' dailybackup.sh
拡張子 .sh のファイルだけをLFに置換する場合
$ find . -name \*.sh -type f | xargs -n 10 nkf -Lu --overwrite
ファイルは全てLFに置換する場合
$ find . -type f | xargs -n 10 nkf -Lu --overwrite
それでは、crontab 設定ファイルに追記しましょう。
$ sudo vi /etc/crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
25 6 * * * root cd / && run-parts --report /etc/cron.daily
0 0 * * * root /home/ubuntu/scripts/dailybackup.sh >/dev/null 2>&1
.....
※書式にはルールがあり、区切り文字に注意します。
m(Space)h(Tab)dom(Space)mon(Space)dow(Tab)user(Tab)Commands
サービスを再起動して、設定を反映させましょう。
$ sudo service cron restart
|