ラズパイで作る自宅WEBサーバ構築
第10回 crontab 設定 2025.06.19
今回は crontab の設定です。
システム関連のログファイルは放置しておくと、膨大なサイズに膨れ上がります。
ログファイルを世代管理することにより、ファイルサイズを抑えるとともに、ログの可読性を高めます。
世代管理を行うには、logrotate を用います。まずは、crontab を利用して、このlogroateが定期的に起動するように設定します。
ubuntu 22.04 Server では、logrotate は標準でインストールされています。
$ dpkg --get-selections | grep logrotate
logrotate install
$ logrotate --version
logrotate 3.19.0
ubuntu-22.04-server の場合は、システムをインストールするとすぐに、logrotateが実施されます。
$ ls -l /var/log
total 3552
-rw-r--r-- 1 root root 327 8月 1 16:15 alternatives.log
-rw-r--r-- 1 root root 2113 5月 16 23:12 alternatives.log.1
-rw-r--r-- 1 root root 1371 4月 4 22:39 alternatives.log.2.gz
drwxr-x--- 4 root adm 4096 8月 1 10:55 apache2
drwxr-xr-x 2 root root 4096 8月 1 16:15 apt
-rw-r----- 1 syslog adm 13474 8月 1 16:39 auth.log
-rw-r----- 1 syslog adm 37506 8月 1 10:55 auth.log.1
-rw-r----- 1 syslog adm 396 5月 16 15:54 auth.log.2.gz
-rw-r----- 1 syslog adm 2463 4月 13 23:39 auth.log.3.gz
-rw-r----- 1 syslog adm 4267 4月 12 19:05 auth.log.4.gz
-rw------- 1 root root 70314 8月 1 15:58 boot.log
-rw------- 1 root root 106155 8月 1 10:55 boot.log.1
-rw------- 1 root root 34837 5月 16 15:54 boot.log.2
-rw------- 1 root root 35626 4月 14 00:00 boot.log.3
-rw------- 1 root root 34472 4月 13 19:11 boot.log.4
-rw------- 1 root root 36164 4月 12 19:05 boot.log.5
-rw------- 1 root root 35101 4月 4 18:19 boot.log.6
-rw------- 1 root root 69163 4月 3 09:41 boot.log.7
-rw-rw---- 1 root utmp 0 8月 1 10:55 btmp
-rw-rw---- 1 root utmp 400 5月 16 15:56 btmp.1
-rw-r----- 1 root adm 62853 8月 1 15:59 cloud-init-output.log
-rw-r----- 1 syslog adm 1202631 8月 1 15:59 cloud-init.log
drwxr-xr-x 2 root root 4096 2月 10 2023 dist-upgrade
-rw-r----- 1 root adm 35683 8月 1 15:58 dmesg
-rw-r----- 1 root adm 34740 8月 1 14:40 dmesg.0
-rw-r----- 1 root adm 10847 8月 1 10:55 dmesg.1.gz
-rw-r----- 1 root adm 10908 5月 16 23:23 dmesg.2.gz
-rw-r----- 1 root adm 10790 5月 16 19:59 dmesg.3.gz
-rw-r----- 1 root adm 10946 5月 16 15:54 dmesg.4.gz
-rw-r--r-- 1 root root 3276 8月 1 16:15 dpkg.log
-rw-r--r-- 1 root root 44279 5月 16 23:18 dpkg.log.1
-rw-r--r-- 1 root root 17296 4月 13 22:37 dpkg.log.2.gz
drwxr-sr-x+ 3 root systemd-journal 4096 2月 18 2023 journal
-rw-r----- 1 syslog adm 89007 8月 1 15:59 kern.log
-rw-r----- 1 syslog adm 191310 8月 1 10:55 kern.log.1
-rw-r----- 1 syslog adm 9388 5月 16 15:54 kern.log.2.gz
-rw-r----- 1 syslog adm 29539 4月 13 22:58 kern.log.3.gz
-rw-r----- 1 syslog adm 90825 4月 12 19:05 kern.log.4.gz
drwxr-xr-x 2 landscape landscape 4096 4月 1 14:00 landscape
-rw-rw-r-- 1 root utmp 297184 8月 1 16:02 lastlog
-rw-r----- 1 syslog adm 0 8月 1 10:55 mail.err
-rw-r----- 1 syslog adm 5770 5月 16 23:19 mail.err.1
-rw-r----- 1 syslog adm 171 4月 14 00:06 mail.err.2.gz
-rw-r----- 1 syslog adm 401 4月 13 23:24 mail.err.3.gz
-rw-r----- 1 syslog adm 2533 8月 1 15:58 mail.log
-rw-r----- 1 syslog adm 28177 8月 1 10:55 mail.log.1
-rw-r----- 1 syslog adm 301 4月 14 00:06 mail.log.2.gz
-rw-r----- 1 syslog adm 1332 4月 13 23:24 mail.log.3.gz
drwxr-x--- 2 mysql adm 4096 8月 1 10:55 mysql
drwx------ 2 root root 4096 2月 18 2023 private
-rw-r----- 1 syslog adm 238601 8月 1 16:39 syslog
-rw-r----- 1 syslog adm 463746 8月 1 10:55 syslog.1
-rw-r----- 1 syslog adm 20485 5月 16 15:54 syslog.2.gz
-rw-r----- 1 syslog adm 70593 4月 14 00:00 syslog.3.gz
-rw-r----- 1 syslog adm 186156 4月 12 19:05 syslog.4.gz
-rw-r--r-- 1 root root 301 8月 1 15:24 ubuntu-advantage-timer.log
-rw-r--r-- 1 root root 460 5月 16 23:36 ubuntu-advantage-timer.log.1
-rw-r--r-- 1 root root 257 4月 13 19:51 ubuntu-advantage-timer.log.2.gz
-rw-r--r-- 1 root root 904 8月 1 12:20 ubuntu-advantage.log
-rw-r--r-- 1 root root 904 5月 16 22:53 ubuntu-advantage.log.1
-rw-r--r-- 1 root root 516 4月 4 19:25 ubuntu-advantage.log.2.gz
drwxr-x--- 2 root adm 4096 8月 1 10:55 unattended-upgrades
-rw-rw-r-- 1 root utmp 64800 8月 1 16:02 wtmp
各種ログ・ファイルを最後にログローテーションした日付が記述されている履歴ファイルを覗いてみます。
$ sudo cat /var/lib/logrotate/status
logrotate state -- version 2
"/var/log/syslog" 2024-8-1-10:55:5
"/var/log/dpkg.log" 2024-8-1-10:55:5
"/var/log/unattended-upgrades/unattended-upgrades.log" 2024-8-1-10:55:5
"/var/log/unattended-upgrades/unattended-upgrades-shutdown.log" 2024-8-1-10:55:5
"/var/log/auth.log" 2024-8-1-10:55:5
"/var/log/cloud-init.log" 2024-8-1-10:0:0
"/var/log/apt/term.log" 2024-8-1-10:55:5
"/var/log/apport.log" 2024-4-1-4:0:0
"/var/log/ubuntu-advantage*.log" 2024-4-1-4:0:0
"/var/log/cloud-init-output.log" 2024-8-1-10:0:0
"/var/log/apt/history.log" 2024-8-1-10:55:5
"/var/log/mysql/error.log" 2024-8-1-10:55:5
"/var/log/boot.log" 2024-8-1-10:55:5
"/var/log/alternatives.log" 2024-8-1-10:55:5
"/var/log/debug" 2024-4-1-4:0:0
"/var/log/mail.log" 2024-8-1-10:55:5
"/var/log/kern.log" 2024-8-1-10:55:5
"/var/log/mysql.log" 2024-4-12-19:0:0
"/var/log/apache2/access.log" 2024-4-3-9:0:0
"/var/log/ubuntu-advantage-timer.log" 2024-8-1-10:55:5
"/var/log/ufw.log" 2024-4-1-4:0:0
"/var/log/wtmp" 2024-4-1-4:0:0
"/var/log/daemon.log" 2024-4-1-4:0:0
"/var/log/mail.warn" 2024-4-1-4:0:0
"/var/log/ubuntu-advantage.log" 2024-8-1-10:55:5
"/var/log/btmp" 2024-8-1-10:55:5
"/var/log/lpr.log" 2024-4-1-4:0:0
"/var/log/mail.err" 2024-8-1-10:55:5
"/var/log/unattended-upgrades/unattended-upgrades-dpkg.log" 2024-4-1-4:0:0
"/var/log/user.log" 2024-4-1-4:0:0
"/var/log/mail.info" 2024-4-1-4:0:0
"/var/log/apache2/other_vhosts_access.log" 2024-4-3-9:0:0
"/var/log/apache2/error.log" 2024-8-1-10:55:5
"/var/log/cron.log" 2024-4-1-4:0:0
"/var/log/messages" 2024-4-1-4:0:0
各サービスごとの設定ファイルを確認します。
$ ls -l /etc/logrotate.d
-rw-r--r-- 1 root root 120 9月 12 2021 alternatives
-rw-r--r-- 1 root root 433 12月 5 2023 apache2
-rw-r--r-- 1 root root 126 11月 12 2019 apport
-rw-r--r-- 1 root root 173 4月 8 2022 apt
-rw-r--r-- 1 root root 91 3月 18 2022 bootlog
-rw-r--r-- 1 root root 130 10月 14 2019 btmp
-rw-r--r-- 1 root root 144 3月 27 22:36 cloud-init
-rw-r--r-- 1 root root 112 9月 12 2021 dpkg
-rw-r--r-- 1 root root 845 6月 15 2023 mysql-server
-rw-r--r-- 1 root root 374 12月 24 2021 rsyslog
-rw-r--r-- 1 root root 270 3月 8 2022 ubuntu-advantage-tools
-rw-r--r-- 1 root root 209 9月 19 2021 ufw
-rw-r--r-- 1 root root 235 2月 19 2021 unattended-upgrades
-rw-r--r-- 1 root root 145 10月 14 2019 wtmp
この中の、rsyslog 設定ファイルをみてみます。rsyslogはサーバ上のさまざまなログ収集を行うソフトウェアです。
$ cat /etc/logrotate.d/rsyslog
/var/log/syslog
/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が動くタイミングを確認します。
$ ls /etc/cron*
/etc/crontab
/etc/cron.d:
e2scrub_all php
/etc/cron.daily:
apache2 apport apt-compat dpkg logrotate man-db
/etc/cron.hourly:
/etc/cron.monthly:
/etc/cron.weekly:
man-db
/etc/cron.daily に logrotate があります。
一応、スクリプトの内容をみてみます。
$ cat /etc/cron.daily/logrotate
#!/bin/sh
# skip in favour of systemd timer
if [ -d /run/systemd/system ]; then
exit 0
fi
# this cronjob persists removals (but not purges)
if [ ! -x /usr/sbin/logrotate ]; then
exit 0
fi
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit $EXITVALUE
次に、crontab 設定をみてみると、毎日実行される /etc/cron.daily のスクリプトがコメントアウトされています。
$ cat /etc/crontab
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
crontabとanacronは、動くタイミングが違います。
・crontab…指定された時間にマシンが落ちていたら何もしない
・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
|