カテゴリー内の他の記事

第8回 バックアップの処理を定期実行してみよう

フォローする

  (著者:Cstap 瀧ヶ平 充

こんにちは、前回は第6回での操作をシェルスクリプト化しました。

今度は前回作成したシェルスクリプト kintone-backup.sh を定期的に実行させるため、Mac環境ではLaunchdを、Cygwin及びLinux環境ではcronを設定していきます。
また、定期実行とあわせて、エラーログを出力出来るようにシェルスクリプトを編集していきます。

処理をスケジューリングする

各環境ごとに準備が異なるため、まずはそれぞれの環境で準備をしましょう。

Mac OS X/OS X/macOS の設定

crond のサービスは Mac OS X 10.4 Tiger以降は Launchd に置き換えられました。ここでは Launchd を利用した定期実行設定の概略を参考として紹介します。

はじめに、実行内容をXMLで指定する launchd.plist を作成します。ファイル名は任意に決めて問題ありませんが、今回は kintone-backup.daily.plist というファイル名で作成します。

以下、毎月10日の11時00分にバックアップを実行する場合の例です。

/path/to/kintone-backup.shの部分はkintone-backup.shへのパスに置き換えてください。

kintone-backup.daily.plist の編集が終わったら、下記ディレクトリに配置します。

配置が完了したら、launchd に作成したファイルを登録します。

ここまでで定期実行の設定は完了です。

ここでは概略のみ説明しましたが、 launchd.plist 作成方法の詳細は 公式ドキュメント を参照してください。

Cygwin

Cygwin上でcronを使う場合、cygrunsrvというコマンドをCygwin上で実行します。croncygrunsrvが入っていない場合はCygwinのsetup.exeから追加インストールしてください。

このときCygwinのbashはWindowsの管理者権限で実行する必要があります。

これでOSの起動時に自動でcronサービスが実行されます。手動でcronを開始したい場合は末尾に -t manual をつけて実行してください。

手動でcronを起動する場合は、下記のコマンドを実行します。

Linux

Linuxでは各ディストリビューションで状況が異なるので、Cent OS(およびRHEL)とUbuntuの最新版(Cent OS7・RHEL7以降 及び Ubuntu v15.04以降)についてのみ、ここで触れます。

それ以前のバージョンの場合は実行方法が異なるので、必要に応じてそれぞれ調べてください。

これらのOSの場合はSystemdを利用しているので、systemctlコマンドでcrondサービスを実行します。

この操作にはスーパーユーザ権限が必要です。rootユーザで以下のコマンドを実行するか、システム管理者にユーザをvisudoコマンドで/etc/sudoersへ現在のユーザを追加してもらった上で、sudoをつけてroot権限でコマンドを実行してください。

システムの起動時サービスを起動するには、下記のコマンドを実行します。一般ユーザで実行する場合は先程と同様にsudoをつけて実行します。

サービスの実行状態は下記コマンドを実行して確認します。

cronジョブの追加

Mac以外を利用している方はcronの設定をしていきましょう。

cronで定期実行されるタスク(スクリプト)は「ジョブ」と呼ばれます。実行対象となるジョブの一覧を編集するには crontab -e を実行します。

このとき、crontabは環境変数 EDITOR に格納されているパスのコマンドラインエディタを利用します。

定期実行ジョブの編集を始める前に、コマンドラインエディタについてひと通り確認してみましょう。

環境変数 EDITOR の設定

cronジョブの編集に使用するエディタは、下記コマンドを実行して設定してください。

コマンドラインで使えるエディタにはnano、EmacsやVimなどありますが、今回はVimの利用を想定して説明しています。

もしVimがインストールされていない場合は、Vimをインストールしておいてください。

また、他のエディタを使いたい方は、下記の要領で環境変数を設定してください。

Vimの操作

Vimはノーマルモード・挿入モード・選択モードの3つのモードがあるエディタです。

Vimは起動時はノーマルモードになっており、Iキーでカーソルの左側からの挿入モードへ切り替え、Aキーでカーソルの右側からの挿入モードへ切り替えが可能です。
挿入モードからはEscキーやCtrl+[でノーマルモードへ切り替えられます。

ノーマルモードでは矢印キーか、H J K Lキーでそれぞれ左 下 上 右へのカーソル移動が可能です。

この他のキー(あるいはキーの組み合わせ)にも色々な機能が割り当てられているので、Vimチートシートなどで覚えると便利です。

ノーマルモードではこの他にも:から始まるコマンドを入力・実行する機能があります。

挿入モードではVim特有のショートカットによる機能を利用できます。(通常のショートカットとは異なりますので注意してください。)

また、ファイルを開くときはノーマルモードで:e ファイルへのパスを入力しEnter、
保存するときは:wを入力しEnterでそれぞれ可能です。

終了するときはノーマルモードで:qで終了できます。

cron設定の書き方

cronで定期実行するジョブの一覧を編集するには、下記コマンドを実行します。

このまま実行すると作業しているユーザがジョブの実行ユーザになります。

crontab -e username のようにコマンドでユーザを指定すると、ジョブを実行するユーザを指定できます。

cronの設定は各行ごとにスペース区切りに書きます。Vimを使う場合は、カーソルを目的の位置に移動した後、iまたはaで挿入モードに移行しましょう。

曜日は日曜日を0として一日ごとに1つ上の数字に対応します。また、このとき設定しない項目は*で埋めます。

例えば、毎月10日の11時00分にkintone-backup.shを実行する場合、下記のように記述します。

/path/to/kintone-backup.shの部分はkintone-backup.shへのパスに置き換えてください。

設定を書き終えたら、EscまたはCtrl-[でノーマルモードに移行し、:wで保存し:qでVimを終了しましょう。

実行時のエラーログ

自動で実行されるのはうれしいですが、シェルスクリプトの実行に成功したか失敗したかなどの情報が確認できないと、運用時に困ることがあります。

簡易的にエラーログを出力できるように、シェルスクリプトを編集していきましょう。

シェルスクリプトの処理の内容については第7回を参照してください。

シェルスクリプトファイルを編集した場合、シェルスクリプトを定期実行のときに設定したパスに再配置するのを忘れないようにしましょう。

エラーロギングの準備

まず、エラーが発生したらシェルスクリプトを中断するようにします。

bashの-eオプションをつけた状態でシェルスクリプトを実行すると、実行後ステータスが0でない場合、つまりコマンド実行が失敗した場合にそこでシェルスクリプトを終了することができます。

そのため、第7回で宣言したshebangを次のように書き換えます。

次に、エラーログを記録するファイルのパスを変数に格納します

実行日時の印字

実行日をわかるようにするために、次のようにしてログの頭にdateコマンドを使って日付を印字します。

エラー出力のリダイレクト

エラー出力にはシェルのリダイレクト機能を利用します。

2> ファイル名 というように出力先を変更すると、エラー出力のみを指定のファイルに書き出すことができます。これを利用して簡易的なエラーログの仕組みを実装します。

2>>というかたちにすれば、エラーメッセージをファイルに追記する形でリダイレクトしてくれるので、こちらも使います。

パイプライン処理がない場合

今回はレコードのcli-kintoneを実行するたびにエラーログを出力するように変更します。

パイプライン処理をしていない実行コマンドの場合は、2>> $errorLog スクリプトの末尾に追記します。

この実行コマンドの場合、以下のように書き換えます。

パイプライン処理がある場合

パイプライン処理のある実行コマンドの場合、cli-kintoneの実行コマンドの行の|の直前に 2>> $errorLog を追加します。

この実行コマンドの場合、以下のように書き換えます。

書き換え後全体のシェルスクリプト

ここまでに紹介してきたエラーログ追加の変更を、シェルスクリプト全体に反映させましょう。

こうすることで、エラーが発生した場合も途中で処理を中止し、ログを残すことが可能です。

ここではエラーを単一のログファイルに出力していますが、date -I とコマンド置換を用いてファイル名を決めれば、日付ごとにエラーログを分けることもできますね。

すでにcronLaunchdで定期実行の設定をしているので、今回はこれで完了です。
動作確認は、設定日時まで待つか、一時的に実行時刻を5分後などに設定して行うと良いでしょう。

以上で第8回は終了です。

難しいコマンドライン操作でしたが、いかがでしたか?
次回もお楽しみに。

記事に関するフィードバック

直接的に記事と関連がないご質問はcybozu developer コミュニティをご活用ください。

ログインしてコメントを残してください。
Powered by Zendesk