見出し画像

【Linux】 cronの設定

cron

決められた時刻に定期的に特定のコマンドを実行する機能のこと。


crontabコマンド

定期的に実行するコマンドや時刻を設定する。cronデーモンによって指定した時刻とコマンドが実行される。システムでは/etc/crontab が該当する。ユーザー以下でも/var/spool/cron ディレクトリが作成される。
  -e : crontabの編集(ユーザーごとに使用するcronの設定)
  -l : crontabの表示
  -r : crontabの削除
  -u user:userで指定したユーザのcrontabファイルを操作の対象とする

crontab -e
crontab -l
crontab -r


設定ファイル

/var/spool/cron/user:ユーザの自動タスク設定ファイル
/etc/crontab:毎時、毎日、毎月、毎週の自動タスクのメイン設定ファイル
/etc/cron.hourly:毎時実行される自動タスク設定ファイル
/etc/cron.daily:毎日実行される自動タスク設定ファイル
/etc/cron.monthly:毎月実行される自動タスク設定ファイル
/etc/cron.weekly:毎週実行される自動タスク設定ファイル
/etc/cron.d:上記以外の自動タスク設定ファイル

/etc/crontab

このファイルには、指定時間ごとに実行されるように設定されており、システム全体のcron設定を行う。

#vi /etc/crontab

-------------------------------------------------------
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

# run-parts
01 * * * * root run-parts /etc/cron.hourly
05 2 * * * root run-parts /etc/cron.daily
20 2 * * 0 root run-parts /etc/cron.weekly
40 2 1 * * root run-parts /etc/cron.monthly
-------------------------------------------------------

0,15,30,45分フィールドで指定した場合、15分に一度処理を実行。
1-5曜日フィールドで指定した場合、月曜日~金曜日に処理を実行。
1,3,7-9時間フィールドで指定した場合、1時、3時、7時、8時、9時に処理を実行。
1-5/2時間フィールドで指定した場合、1時、3時、5時に処理を実行。

他の時間ごとのファイルには直接ディレクトリ内部にスクリプトを作成すると、時間ごとにスクリプトが実行される。

EXT:/etc/cron.daily/loglotate

atコマンド:指定した時刻に一回だけコマンドを実行する
batchコマンド:システム負荷が小さくなったときに一回だけコマンドを実行する

at , batch に限らず、/etc/at.allow と deny で実行の許可をコントロールできる。


アクセス制御

デフォルトの状態では、すべてのユーザが使用することができるが、使用を許可したい場合には、「/etc/cron.allow」ファイルを作成しユーザを記述する。使用を許可したくない場合には、「/etc/cron.deny」ファイルを作成しユーザを記述する。

/etc/cron.allowが存在する場合には、/etc/cron.denyが存在しても、設定内容は無視され、/etc/cron.allowに登録されたユーザのみが使用できる。


設定例

標準

 #crontab -u root -e

-------------------------------------------------------
# 10分ごとに実施したい
/10 * * * * /usr/local/amachan.sh

# 3/4と9/4の0時05分に実施したい
5 0 4 3,9 * /usr/local/amachan.sh

# 9時から21時の間で10分ごとに実施したい
/10 9-21 * * * /usr/local/amachan.sh

#土曜と日曜の0時~7時までの2時間ごと12分に実施したい
12 0-7/2 * * 6,7 /usr/local/amachan.sh

# 毎月1日の、4:40分に実行
40 4 1 * * /usr/bin/php foo.php

# 月曜日から土曜まで、21:00に実行
0 21 * * 1-6 /usr/bin/php foo.php

# 毎時0分に実行
0 * * * * /usr/bin/php foo.php
-------------------------------------------------------

Backup関係

# 毎週土曜日の午前3時に、/var/logディレクトリの内容をバックアップ
0 3 * * 6 tar -cvzf /backup/log_backup_$(date +\%Y-\%m-\%d).tar.gz /var/log

# 毎日午前5時に、/home/user2ディレクトリの内容をバックアップする。バックアップ先には、前日のバックアップファイルがある場合は、それを削除してから新たにバックアップする。
0 5 * * * find /backup/user2_backup_* -mtime +0 -exec rm {} \; ; tar -cvzf /backup/user2_backup_$(date +\%Y-\%m-\%d).tar.gz /home/user2

# 毎日午前2時に/var/logディレクトリをバックアップし、backup.tar.gzという名前で保存します。そして、scpコマンドでremote-serverに転送
0 2 * * * root tar czf /backup/backup.tar.gz /var/log && scp /backup/backup.tar.gz user@remote-server:/backup/

# 毎日午前5時に/dataディレクトリのファイルの差分をバックアップし、rsyncコマンドでremote-serverに転送
0 5 * * * root rsync -avz /data/ user@remote-server:/backup/

# 毎日午前6時に実行され、/backup/ディレクトリ内の7日より古いバックアップファイルを削除し、新しいバックアップファイルをuser@remote-serverの/backup/ディレクトリにscpを使用して転送
0 6 * * * root find /backup/* -mtime +7 -exec rm {} \; && scp /backup/* user@remote-server:/backup/


etc/cron.dailyなど

#!/bin/sh

# logrotateスクリプトを設定しディスク容量を節約する
/usr/sbin/logrotate /etc/logrotate.conf

# 毎日自動的にデータをバックアップ
tar -czf /backup/backup_$(date +%Y-%m-%d).tar.gz /data

# /tmpディレクトリ内の30日以上前に更新されたファイルを削除
/usr/sbin/tmpwatch 30d /tmp

# MySQLデータベースを毎日自動的にバックアップ
mysqldump -u dbuser -p dbpassword dbname > /backup/dbname_$(date +%Y-%m-%d).sql

# /mnt/dataディレクトリ内の30日以上前に更新されたファイルを削除
/usr/bin/find /mnt/data -type f -mtime +30 -delete

# Postfixメールサーバーのメールキューを削除
/usr/sbin/postsuper -d ALL

# Nginxウェブサーバーのログファイルをクリーンアップ
/usr/bin/find /var/log/nginx -type f -name "*.log" -mtime +30 -delete

# iptablesファイアウォールの設定を確認
/sbin/iptables-save > /etc/sysconfig/iptables

# ファイルシステムの問題を検出し、修復する
/usr/bin/fsck -A -C -y











この記事が参加している募集

この経験に学べ

よろしければサポートお願いします!よりいい情報を発信します。