ラズパイで作る自宅WEBサーバ:nginx編
第11回 crontab 設定
2026.11.04
システム関連のログファイルは放置しておくと、膨大なサイズに膨れ上がります。
ログファイルを世代管理することにより、ファイルサイズを抑えるとともに、ログの可読性を高めます。
世代管理を行うには、logrotate を用います。まずは、crontab を利用して、このlogroateが定期的に起動するように設定します。
ubuntu 24.04 Server では、logrotate は標準でインストールされています。
$ dpkg --get-selections | grep logrotate
logrotate install
$ logrotate --version
logrotate 3.21.0
ubuntu-24.04-server をインストールするとすぐに、logrotateが実施されます。
$ ls -l /var/log
-rw-r--r-- 1 root root 9290 8月 4 12:27 alternatives.log
-rw-r--r-- 1 root root 32934 7月 31 11:21 alternatives.log.1
-rw-r----- 1 root adm 0 2月 10 12:01 apport.log
drwxr-xr-x 2 root root 4096 8月 4 10:46 apt
-rw-r----- 1 syslog adm 233170 8月 4 14:58 auth.log
-rw-r----- 1 syslog adm 120597 8月 1 21:30 auth.log.1
-rw-r--r-- 1 root root 68874 2月 10 11:58 bootstrap.log
-rw-rw---- 1 root utmp 400 8月 2 19:40 btmp
-rw-rw---- 1 root utmp 0 2月 10 11:58 btmp.1
-rw-r----- 1 root adm 27825 8月 4 12:27 cloud-init-output.log
-rw-r----- 1 syslog adm 782666 8月 4 12:27 cloud-init.log
drwxr-xr-x 2 root root 4096 1月 20 2026 dist-upgrade
-rw-r----- 1 root adm 46995 8月 4 12:27 dmesg
-rw-r----- 1 root adm 46995 8月 4 12:15 dmesg.0
-rw-r----- 1 root adm 14124 8月 4 07:27 dmesg.1.gz
-rw-r----- 1 root adm 14119 8月 3 21:41 dmesg.2.gz
-rw-r----- 1 root adm 14118 8月 3 16:46 dmesg.3.gz
-rw-r----- 1 root adm 14009 8月 3 13:03 dmesg.4.gz
-rw-r--r-- 1 root root 379970 8月 4 10:47 dpkg.log
-rw-r--r-- 1 root root 545818 7月 31 06:58 dpkg.log.1
-rw-r--r-- 1 root root 0 2月 10 11:58 faillog
drwxr-sr-x+ 3 root systemd-journal 4096 2月 10 12:01 journal
-rw-r----- 1 syslog adm 413699 8月 4 14:23 kern.log
-rw-r----- 1 syslog adm 265832 8月 1 21:30 kern.log.1
drwxr-xr-x 2 landscape landscape 4096 2月 10 12:00 landscape
-rw-rw-r-- 1 root utmp 296296 8月 4 14:23 lastlog
-rw-r----- 1 syslog adm 2107 8月 4 11:35 mail.err
-rw-r----- 1 syslog adm 29210 8月 4 12:27 mail.log
drwxr-xr-x 2 root adm 4096 8月 4 06:09 nginx
-rw------- 1 root root 2304 8月 4 12:27 php8.3-fpm.log
-rw------- 1 root root 1313 8月 2 06:09 php8.3-fpm.log.1
drwx------ 2 root root 4096 2月 10 11:58 private
drwxr-x--- 3 root adm 4096 8月 2 06:14 samba
-rw-r----- 1 syslog adm 1426597 8月 4 15:00 syslog
-rw-r----- 1 syslog adm 874870 8月 2 06:09 syslog.1
drwxr-xr-x 2 root root 4096 8月 4 06:09 sysstat
drwxr-x--- 2 root adm 4096 8月 3 13:03 unattended-upgrades
-rw-rw-r-- 1 root utmp 62800 8月 4 14:23 wtmp
各種ログ・ファイルを最後にログローテーションした日付が記述されている履歴ファイルを覗いてみます。
$ sudo cat /var/lib/logrotate/status
logrotate state -- version 2
"/var/log/syslog" 2026-8-2-6:9:48
"/var/log/nginx/error.log" 2026-8-4-6:9:29
"/var/log/dpkg.log" 2026-8-1-9:38:1
"/var/log/unattended-upgrades/unattended-upgrades.log" 2026-8-1-9:38:1
"/var/log/mysql/*.log" 2026-8-1-9:0:0
"/var/log/unattended-upgrades/unattended-upgrades-shutdown.log" 2026-7-30-14:0:0
"/var/log/auth.log" 2026-8-2-6:9:48
"/var/log/apt/term.log" 2026-8-1-9:38:1
"/var/log/cloud-init.log" 2026-7-30-14:0:0
"/var/log/apport.log" 2026-7-30-14:0:0
"/var/log/ubuntu-advantage*.log" 2026-7-30-14:0:0
"/var/log/apt/history.log" 2026-8-1-9:38:1
"/var/log/cloud-init-output.log" 2026-7-30-14:0:0
"/var/log/boot.log" 2026-7-30-14:0:0
"/var/log/alternatives.log" 2026-8-1-9:38:1
"/var/log/mail.log" 2026-7-30-14:0:0
"/var/log/kern.log" 2026-8-2-6:9:48
"/var/log/php8.3-fpm.log" 2026-8-2-6:9:48
"/var/lib/mysql/mysqld.log" 2026-8-1-9:0:0
"/var/log/ufw.log" 2026-7-30-14:0:0
"/var/log/wtmp" 2026-7-30-14:0:0
"/var/log/btmp" 2026-8-1-9:38:1
"/var/log/unattended-upgrades/unattended-upgrades-dpkg.log" 2026-8-3-13:3:0
"/var/log/user.log" 2026-7-30-14:0:0
"/var/log/nginx/access.log" 2026-8-4-6:9:29
"/var/lib/mysql/mariadb.log" 2026-8-1-9:0:0
"/var/log/cron.log" 2026-7-30-14:0:0
各サービスごとの設定ファイルを確認します。
$ ls -l /etc/logrotate.d
-rw-r--r-- 1 root root 120 2月 5 2024 alternatives
-rw-r--r-- 1 root root 126 4月 22 2022 apport
-rw-r--r-- 1 root root 173 3月 22 2024 apt
-rw-r--r-- 1 root root 91 1月 5 2024 bootlog
-rw-r--r-- 1 root root 130 10月 14 2019 btmp
-rw-r--r-- 1 root root 144 8月 13 2025 cloud-init
-rw-r--r-- 1 root root 112 2月 5 2024 dpkg
-rw-r--r-- 1 root root 1859 10月 11 2025 mariadb
-rw-r--r-- 1 root root 329 12月 1 2023 nginx
-rw-r--r-- 1 root root 215 7月 17 03:30 php8.3-fpm
-rw-r--r-- 1 root root 248 2月 28 2025 rsyslog
-rw-r--r-- 1 root root 270 2月 19 2025 ubuntu-pro-client
-rw-r--r-- 1 root root 209 5月 16 2023 ufw
-rw-r--r-- 1 root root 235 2月 13 2024 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.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/cron.log
{
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
$ sudo cat /var/lib/logrotate/status
次に、logrotateが動くタイミングを確認します。
$ ls /etc/cron*
/etc/crontab
/etc/cron.d:
e2scrub_all php sysstat
/etc/cron.daily:
apport apt-compat dpkg logrotate man-db sysstat
/etc/cron.hourly:
/etc/cron.monthly:
/etc/cron.weekly:
man-db
/etc/cron.yearly:
/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
次に、/etc/crontab 設定において、毎日実行される /etc/cron.daily のコメントアウトを外し、anacron設定を無効にします。
$ cat /etc/crontab
test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
↓
cd / && run-parts --report /etc/cron.daily
crontabとanacronは、動くタイミングが違います。
・crontab…指定された時間にマシンが落ちていたら何もしない
・anacron…マシンが落ちていたら次に起動した時に実行する
# 17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root cd / && run-parts --report /etc/cron.daily
# 47 6 * * 7 root cd / && run-parts --report /etc/cron.weekly
# 52 6 1 * * root cd / && run-parts --report /etc/cron.monthly
サービスを再起動して、設定を反映させましょう。
$ 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世代目以降はファイルが圧縮されています。
次に、MariaDBデータベースを1日ごとにバックアップを取りましょう。
まずは、MariaDBのデータをバックアップするスクリプトを書いてみます
$ 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 サーバに転送する際には注意が必要です。
メモ帳などではテキストの終端が 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
|