cronによるバックアップの定時実行

以前、コマンドラインによる MySQL データのバックアップでスクリプトファイルを紹介しましたが、そのスクリプトを指定した日時で自動実行するための手順についてまとめました。

前回作成したスクリプトファイル

前回の記事では、さくらのレンタルサーバー(スタンダードプラン)で動かしている WordPressMySQL を例にし、MySQL のデータをバックアップするシェルスクリプトを作成しました。

スクリプトファイルは ~/backup というディレクトリに、sql-backup-sh2.sh という名前で作成しました。

なお、シェルスクリプトで MySQL のデータベースに接続するための個人用オプションファイル ~/.my.cnf を作成してある前提で説明を進めますので、ご了承ください。

詳しくは、前回の記事「コマンドラインによる MySQL データのバックアップ」の コマンドラインによる MySQL バックアップ時のパスワード自動入力 の項を参照ください。

前回の記事で作成したシェルスクリプトは、以下のような内容でした。なお、# で始まる行はコメントで、1行目の #!/bin/sh はシェルスクリプトでは特別な意味を持っています。

$ cd ~/script
$ cat sql-backup-sh2.sh
#!/bin/sh
#
# Backup for MySQL Database
#
cd ~/backup
#
db_opt=--add-drop-table
db_host=db01.example.com
db_user=root
db_name=wp-test
bk_name=sql-backup-sh2.sql
#
 
mysqldump $db_opt -h $db_host -u $db_user $db_name > $bk_name
mysqldump $db_opt -h $db_host -u $db_user $db_name > $bk_name | gzip -c > $bk_name.gz
 
ls -l $bk_name*

このファイルに以下のように chmod(1) で実行権限 700 を与えて起動すると、MySQL のデータをエクスポートし、最終的には ~/backup というディレクトリに sql-backup-sh2.sql.gz という名前でバックアップファイルが作成されます。

$ chmod 700 sql-backup-sh2.sh
$ ./sql-backup-sh2.sh
-rw-r--r--  1 root  users    1706607  7月 25 06:15 sql-backup-sh2.sql
-rw-r--r--  1 root  users     187616  7月 25 06:15 sql-backup-sh2.sql.gz

今回は、このスクリプトを修正し、サーバの標準機能である cron(8) というデーモンの設定ファイル crontab(5) を作成します。

cron に関する情報源

さくらのレンタルサーバーの OS は FreeBSD です。FreeBSD の日本語マニュアル cron(8)によると、

  • 定期的にコマンドを実行するデーモンである。
  • /etc/passwd 内のアカウント名と同じ名前の crontab(5) ファイルを探す。
  • cron(8) ユーティリティは 1 分おきに目覚めて crontab(5) ファイルを調べる。
  • crontab(5) ファイルに書かれている内容がその時間にマッチすれば各コマンドを実行する。

とあります。また、FreeBSD の日本語マニュアル crontab(1) には、

  • 各ユーザは、自分用の crontab(5) ファイルを持つことができる。

とあります。

なお、crontab(5) の設定については、FreeBSD の日本語マニュアル crontab(5)にあります。

スクリプトファイルの修正

スクリプトファイルで使用している変数について

このスクリプトで使用している変数名は、以下のとおりです。変数名および値については、必要があればご自身の環境に応じて修正してください。

db_opt
mysqldump(1) に与えるオプションです。
db_host
MySQL データベースのサーバ名です。
db_user
データベースに接続するためのユーザー名です。
db_name
WordPress で使用している MySQL のデータベース名です。
bk_name
最終的に作成するバックアップのファイル名です。

スクリプトファイルの修正

以下の例では変数 bk_name の値に date +%Y-%m%d-%H%M を挿入していますが、これはコマンド date(1) を使用してファイル名に日付を付加するためのものです。FreeBSD の場合は、FreeBSD の日本語マニュアル date(1)で確認できます。

$ cd ~/script
$ vi sql-backup-sh2.sh
#!/bin/sh
#
# Backup for MySQL Database
#
# FileName : ~/sql-backup-sh2.sh
#
cd ~/backup
#
#
# 以下の4行は変更なし
db_opt=--add-drop-table
db_host=db01.example.com
db_user=root
db_name=wp-test
#
# 下段のように変更
# bk_name=sql-backup-sh2.sql
bk_name=sql-backup-sh2-`date +%Y-%m%d-%H%M`.sql
#
#
# Scripts
mysqldump $db_opt -h $db_host -u $db_user $db_name > $bk_name
mysqldump $db_opt -h $db_host -u $db_user $db_name > $bk_name | gzip -c > $bk_name.gz
 
ls -l $bk_name*

修正したスクリプトファイルの動作確認

このように修正ができたら、以下のようにして sql-backup-sh2.sh を実行して動作確認を行いましょう。

$ ./sql-backup-sh2.sh
-rw-r--r--  1 root  users  1706607  7月 25 18:02 sql-backup-sh2-2016-0725-1802.sql
-rw-r--r--  1 root  users   187616  7月 25 18:02 sql-backup-sh2-2016-0725-1802.sql.gz

ファイル名が長いですが、スクリプトにエラーが発生して停止しなければ、上のように二つのファイルが出来ます。

スクリプトファイルを crontab(5) に登録

スクリプトの動作確認が出来ましたので、次にサーバに crontab(5) の登録を行います。さくらのレンタルサーバーの場合は、以下の二通りで登録が可能です。

  • ブラウザを介して、レンタルサーバーの管理画面から行う。
  • シェルのコマンドラインで、直接 crontab(5) の設定を行う。

今回は、Windows 環境の経験しか無い方でも設定できるよう、視覚的に分かりやすい「レンタルサーバーの管理画面」から登録する方法を紹介します。

crontab(5) 登録の前準備

前準備としては、以下の内容です。

  • レンタルサーバーの管理画面にログイン済みであること。
  • レンタルサーバーのシェルにログイン済みであること。
  • crontab(5) に登録したいスクリプト名をフルパスで確認してあること。

今回の例では、スクリプトのフルパスは ~/script/sql-backup-sh2.sh です。もしディレクトリ名やファイル名を変更している場合は、正しいフルパスをメモしておきます。

ブラウザ経由で crontab(5) を登録する

レンタルサーバーの管理画面で、アプリケーションの設定 カテゴリの CRONの設定 をクリックします。

Sakura-Crontab-2016-0727_01

CRONの設定 の画面になりますので、新規項目の追加 をクリックします。

Sakura-Crontab-2016-0727_02

CRON設定ファイルの編集 の画面になりますので、まず 実行コマンド の欄に、スクリプトのフルパスを入力します。今回の例では、~/script/sql-backup-sh2.sh です。入力が終わったら、その後ろに半角スペースを1文字入れた後 1> /dev/null を追記します。

~/script/sql-backup-sh2.sh 1> /dev/null
Sakura-Crontab-2016-0727_03

次に、実行日時 の入力を行います。今回は「毎日の午前7時15分」に実行することを想定し、以下のように入力します。

  • 月と日は、* を入力。
  • 時に 7 を入力。
  • 分に 15 を入力。
  • 曜日は、チェックしません。
  • コメント欄は、自分が分かりやすい名前をつけるとよいでしょう。ここでは、MySQL にしました。
Sakura-Crontab-2016-0727_04

この画面をスクロールダウンすると 注意事項参考資料 があります。cron を設定する方は、ぜひ目を通しましょう。

入力した内容に間違いがないことをもう一度確認し、送信 ボタンをクリックします。

送信が完了すると、CRON 設定一覧 に登録したスクリプトファイルが 実行コマンド の欄に表示されます。

Sakura-Crontab-2016-0727_05

この画面にある 環境変数MAILTO を設定すると、スクリプトのエラー等で cron(8) が正常終了しなかった場合に、指定したメールアドレスにメールを送信することが出来ます。

この設定を行う場合は、環境変数MAILTO環境変数の値example@ex.mai.com のように入力します。入力するメールアドレスは、ご自身の実在のメールアドレスを指定します。入力が終わったら、追加 のボタンを押します。

Sakura-Crontab-2016-0727_06

環境変数の追加が完了すると、画面はこのように変わります。ブラウザを介して 実行コマンド の設定内容を変更する場合は、該当箇所のリンクをクリックすると、変更ができます。

Sakura-Crontab-2016-0727_07

この画面の下部にも 注意事項 がありますので、ぜひ目を通しましょう。ブラウザを介しての crontab(5) の登録は、以上で終了です。

コンソールで crontab(5) の編集

前項の冒頭でも触れましたが、UNIX, FreeBSD, Linux ディストリビューション等では、シェルのコマンドラインで、直接 crontab(5) の設定や表示等を行う事ができます。

なお、以下の例はシェルは bash(1) を前提としています。ご了承ください。

コンソールで設定済み crontab(5) の確認

試しに、シェルのコマンドラインで以下のように入力してみましょう。

$ crontab -l
MAILTO=example@ex.mai.com
# NAME: MySQL
15      7       *       *       *   ~/script/sql-backup-sh2.sh 1> /dev/null

おそらく上のように画面に表示されたと思います。ここには、前項でブラウザの画面で登録した内容が表示されています。これらは、1行目から順に以下のようになっています。

  1. 環境変数 MAILTO で登録したメールアドレス。
  2. コメント欄 で入力した内容。
  3. 実行日時 で指定した日時、曜日とコマンド名。

FreeBSD の日本語マニュアル crontab(5)にもあるように、3行目の書式は以下のとおりです。

分  時  日  月  曜日          コマンド名
-----------------------------------------------------------
15   7   *   *  *   ~/script/sql-backup-sh2.sh 1> /dev/null

コンソールで crontab(5) の編集

crontab(1) には、登録済み crontab(5) の確認のほか、新規作成、編集、削除が行えます。

FreeBSD の日本語マニュアル crontab(1)に掲載されていますが、それぞれは

新規作成および編集する場合
crontab -e
削除する場合
crontab -r

で行います。例えば、7時15分を7時30分に変更する場合は、まず

$ crontab -e

を実行します。そうすると、シェルの環境変数 EDITOR で設定されているエディタが起動し、crontab(5) の内容を読み込みますので、行頭の`15` を削除して `30` に置き換えます。修正が終わったら保存し、起動したエディタを終了します。

エディタを終了した際、シェルのプロンプトの1行上に以下のようなメッセージが表示されると思います。

crontab: installing new crontab
$

メッセージが以下のように表示されていれば、修正した内容は保存されていません。

crontab: temp file must be edited in place
$

念のため、再度 crontab -lcrontab(5) の内容を確認しましょう。

crontab(5) の編集結果が保存されない場合

crontab(5) の編集が正常に終了できなかった原因として、いくつかの要因が考えられるのですが、再度FreeBSD の日本語マニュアル crontab(1)を確認してみると、今回の場合は以下の内容が該当すると思われます。

環境変数 VISUAL もしくは EDITOR があれば、この環境変数で指定したエディタを利用するが、PATH=/usr/bin:/bin にインストールされているものを使用する。

そこで、以下の二点を確認します。

  • 環境変数 EDITOR に登録しているエディタを確認する。
  • そのエディタのパスを確認する。
$ echo $EDITOR
vim
 
$ which vim
/home/USER/local/bin/vim

つまり、今回の場合シェルの環境変数 EDITOR で登録していた vim(1) は自分でコンパイルしてインストールしたもので、 /home/USER/local/bin にインストールされていたため、編集画面は表示されるものの、保存を完了できなかったのではないかと思います。

なお、FreeBSD の場合、EDITORemacs(1), elvis(1) 等を設定している場合は、インストール先が以下のようになっていますので、これらの場合も結果は同じだと思います。

$ which emacs elvis vim
/usr/local/bin/emacs
/usr/local/bin/elvis
/usr/local/bin/vim

今回のような場合、crontab(5) の内容を修正する方法として、以下の様な方法があると思います。

  • ブラウザを介してレンタルサーバーの管理画面から修正を行う。
  • シェルのコマンドラインで修正を行う。

今回は、後者について紹介します。今回の問題を解決するには、シェルの環境変数 EDITOR で設定しているエディタは、PATH=/usr/bin:/bin にインストールされているエディタを使う必要があります。

エディタ vi(1) は、UNIX および Unix 系環境であれば、必ずと言ってよいほどインストールされているエディタですので、まずインストールされているパスを確認します。

$ which vi
/usr/bin/vi

vi(1)/usr/bin にあることが確認できましたので、上記の PATH についてはクリアしました。

環境変数 EDITORvi(1) を認識させる方法

今回の例ではシェルの環境変数 EDITOR に設定しているエディタは ~/local/bin/vim です。これを一時的に違う値にする方法として、EDITOR=/usr/bin/vi のようにするとシェルの設定ファイルに手を加えず、一時的に環境変数 EDITOR の設定を上書きすることが出来ます。

今回の場合は、以下のようにします。

$ EDITOR=/usr/bin/vi crontab -e

編集内容を保存してエディタを終了した際、シェルのプロンプトの1行上に以下の様なメッセージが表示されると思います。

crontab: installing new crontab
$

念のため、再度 crontab -lcrontab(5) の内容を確認しましょう。

なお、~/.bashrc のようなシェルの個人用設定ファイルに以下の行を追加しておくと、crontabe を実行した時に、エディタ vi(1) を起動して crontab(5) を編集できます。

alias crontabe='EDITOR=/usr/bin/vi crontab -e'

コンソールで crontab(5) の設定を追加したい場合

この場合は、上記の crontab -e で追記するだけです。例えば、以下のようになります。

$ crontab -l
MAILTO=example@ex.mai.com
# NAME: MySQL
30      7       *       *       *   ~/script/sql-backup-sh2.sh 1> /dev/null
# 追記部分
# NAME: WordPress
30      7       *       *       *   ~/script/wp-backup.sh 1> /dev/null

# で始まる行はコメント(備考欄)で、必須ではありません。

コンソールで crontab(5) の設定内容をバックアップする

crontab(5) の設定内容が消えてなくなることは無いと思うのですが、もしものことを考えてバックアップする方法について紹介したいと思います。

crontab -lcrontab(5) の内容を確認できることはすでに紹介させていただきましたが、これと「標準出力へのリダイレクト」の機能を使うと、crontab(5) の設定内容をファイルに保存できます。

$ crontab -l > ~/.crontab

この1行だけで、ホームディレクトリに ~/.crontab というファイル名で保存できます。ただし、すでにあるファイル名にリダイレクトすると上書きされてしまいますので、注意が必要です。上書きではなく、追記する場合は以下のようにします。

$ crontab -l >> ~/.crontab

コンソールで crontab(5) の設定内容を削除する

もし crontab(5) による定期実行させる必要性がなくなった場合は、コンソールで削除することが可能です。

ただし、削除した内容は復元することが出来ませんので、上記のように念の為にバックアップを取ったうえで削除することをお勧めします。

$ crontab -r
remove crontab for USER? y
 
$ crontab -l
crontab: no crontab for USER

スクリプトファイルを再度修正

上記のcrontab(5) の編集結果が保存されない場合と同じ問題が、スクリプトファイル sql-backup-sh2.sh にもあります。

$ tail ~/script/sql-backup-sh2.sh
# Scripts
mysqldump $db_opt -h $db_host -u $db_user $db_name > $bk_name
mysqldump $db_opt -h $db_host -u $db_user $db_name > $bk_name | gzip -c > $bk_name.gz
 
$ which mysqldump
/usr/local/bin/mysqldump

sql-backup-sh2.shmysqldump をすべて /usr/local/bin/mysqldump に修正する必要があります。今回のスクリプトでは mysqldump は2行しかありませんが、以下の方法が考えられます。

  • 2行について /usr/local/bin/mysqldump に置き換える。
  • 新たな変数を作って、変数名で置き換える。

後者を選択した場合は、スクリプトファイルの内容は以下のようになりますが、変数の内容については皆さんの環境に応じて修正してください。

$ vi ~/script/sql-backup-sh2.sh
#!/bin/sh
#
# Backup for MySQL Database
#
cd ~/backup
#
#
db_opt=--add-drop-table
db_host=db01.example.com
db_user=root
db_name=wp-test
#
bk_name=sql-backup-sh2-`date +%Y-%m%d-%H%M`.sql
#
# 追加
db_dump=/usr/local/bin/mysqldump
#
# Scripts
$db_dump $db_opt -h $db_host -u $db_user $db_name > $bk_name
$db_dump $db_opt -h $db_host -u $db_user $db_name > $bk_name | gzip -c > $bk_name.gz
 
ls -l $bk_name*

cron 用スクリプトファイルを安全な場所に移動する

現在 crontab(5) に登録しているスクリプトファイルは、ホームディレクトリの script というディレクトリにあります。

レンタルサーバーのような共用サーバの場合、他人のホームディレクトリを覗くことも可能です。一般的にドット . で始まるファイルやディレクトリは第三者がアクセス出来ないと言われています。

第三者がアクセス出来ない(と思う)ディレクトリに移動しましょう。ただし、crontab(5) に登録しているスクリプトファイルをいきなり移動した場合、その時間帯やタイミングによって cron(8) がエラーを発生させることも考えられます。作業の流れとしては、以下の手順になると思います。

  1. 新しいディレクトリは ~/.cron にする。
  2. ディレクトリ ~/script の内容を ~/.cron にコピーする。
  3. 必要があれば、スクリプトファイルの名前を変更する。
  4. crontab(5) の内容を修正する。
  5. ディレクトリ ~/script を削除する。

cron 用スクリプトファイルの複製

ディレクトリ ~/script の内容を ~/.cron にコピーする手順は、以下のとおりです。

$ cd ~
$ cp -Rp script .cron
$ ls -Al script .cron
.cron:
-rwx------  1 root  users  403  7月 25 18:02 sql-backup-sh2.sh
 
script:
-rwx------  1 root  users  403  7月 25 18:02 sql-backup-sh2.sh

ファイル名の変更

例として、sql-backup-sh2.shsql-backup.sh に変更する場合は、以下のようにします。

$ cd ~/.cron
$ mv sql-backup-sh2.sh sql-backup.sh
$ ls -Al
-rwx------  1 root  users  403  7月 25 18:02 sql-backup.sh

crontab(5) の修正

~/.cron に移動した(コピーした)スクリプトを crontab(5) に反映させる場合は、コンソールで crontab(5) の編集の手順に沿って crontab -e でスクリプトファイルの新しいディレクトリ名とファイル名に修正します。

$ crontab -e
 
$ crontab -l
MAILTO=example@ex.mai.com
# NAME: MySQL
30      7       *       *       *   ~/.cron/sql-backup.sh 1> /dev/null

以前のディレクトリを削除

今回作成したスクリプトファイルには MySQL データベースへの接続情報も含まれていますので、早めにディレクトリ ~/script を削除することをお勧めします。ディレクトリを削除する場合は、以下のコマンドで削除できます。

$ rm -Rf ~/script
$ ls ~/script
ls: /home/USER/script: そのようなファイルまたはディレクトリはありません

以上で、スクリプトファイルを crontab(5) に登録して定期的に実行させるための作業は終了です。

今回もとても長い文章になってしまいました。最後までお読みいただきありがとうございました。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です