バイオインフォマティクスでは、重要なデータを使うことが多いのでバックアップ作業などは定期的に実行したいものです。確実に、そして簡単に、データバックアップのような単純な処理を、定期的に実行してくれるcrontab
を試してみましょう!
crontabを使ってAmazon S3にデータを自動的にバックアップ(作業の効率化)
crontab とは?
crontab(クロンタブ、あるいはクローンタブ、クーロンタブとも)コマンドはUnix系オペレーティングシステム (OS) において、コマンドの定時実行のスケジュール管理を行うために用いられるコマンドである。標準入力からコマンド列を読み取り、crontabと呼ばれるファイルにそれを記録する。この記録を元に定時になると、その命令内容を読み取り、実行が行われる。
ウィキペディア crontab
crontab の使い方
crontabは、設定ファイルに書かれているコマンドやスクリプトを指定された時間に実行します。
設定ファイルの書き方
実行時間を「分 時 日 月 曜」の順序で書いて指定します。最後に、実行するコマンドやスクリプトを書きます。
設定ファイルの例
# 分 時 日 月 曜 実行スクリプト・コマンド # 例 0 12 * * * my_backup.sh # 12時にバックアップを実行(毎日)
実行時間の指定
実行時間は、分・時・日・月・曜日を、この順序で指定します。半角空白を空けて記述します。複数の条件を指定する場合は、「指定なし」「値リスト」「値の範囲」などを使うと簡潔に表現できます。
- 時:0 〜 24(24時間表記)
- 曜:0 〜 6 または Sun Mon …(日〜土)
- 指定なし:*(アスタリスク)
- 値リスト:,(カンマ) 1, 3, 5 1時,3時,5時
- 値の範囲:-(ハイフン)1-5 1時,2時…5時
- 間隔:/(スラッシュ)1-5/2 1時,3時,5時 1時〜5時で2時間間隔
実行時間の指定例
# 22 時にバックアップ用スクリプトを実行(毎日) # ---------------------------------- # 分 時 日 月 曜 実行スクリプト・コマンド 0 22 * * * my_backup.sh # 毎週日曜日の2時にバックアップ用スクリプトを実行(毎週) # ---------------------------------- # 分 時 日 月 曜 実行スクリプト・コマンド 0 2 * * Sun my_backup.sh # 毎月1日の2時にバックアップ用スクリプトを実行(毎月) # ---------------------------------- # 分 時 日 月 曜 実行スクリプト・コマンド 0 2 1 * * my_backup.sh # 複数登録 # 1月1日の2時にバックアップ用スクリプトを実行 # 毎月1日の2時にバックアップ用スクリプトを実行 # 毎月1日の2時と4時にバックアップ用スクリプトを実行 # 毎月1日の2時〜4時(2時・3時・4時)にバックアップ用スクリプトを実行 # ---------------------------------- # 分 時 日 月 曜 実行スクリプト・コマンド 0 2 1 1 * my_backup.sh 0 2 1 * * my_backup.sh 0 2-4 1 * * my_backup.sh
はじめてのcrontab
登録が1件もなければ、crontab
編集コマンドcrontab -e
から始めます。
はじめてのcrontab作成の場合は、編集に使用するエディターを聞いてくるので番号を入力します。その後、エディタが立ち上がり、crontabの編集画面になります。保存して終了すると登録されます。
# crontab の登録確認 $ crontab -l no crontab for ubuntu # 登録なし # crontab の編集 $ crontab -e no crontab for ubuntu - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano <---- easiest 3. /usr/bin/emacs24 4. /usr/bin/vim.basic 5. /usr/bin/vim.tiny Choose 1-5 [2]: 3
crontab の管理
登録されているcronの情報を表示したり、編集したりする場合は、crontab
にオプションを指定します。登録内容を表示する場合はcrontab -l
、編集する場合はcrontab -e
を使います。
登録されている情報を表示する
$ crontab -l
登録されている情報を編集する
$ crontab -e
Amazon S3 へのバックアップ
準備 ツール(awscli)のインストール
awscliは、Amazon で提供される各種サービスへの操作を、コンソールから実行することが可能です。今回は、S3へデータをバックアップするのに使います。
$ sudo apt install awscli
AWSのアカウントの設定を、ツール(awscli)へ反映させます。
# 設定 $ aws configure AWS Access Key ID : 入力 AWS Secret Access Key : 入力 Default region name : リージョンを入力 Default output format : 必要に応じて入力
Amazon S3 にファイルをコピーする
awscliを使って、S3へデータをバックアップ(コピー)します。使用するコマンドは、aws s3
です。単純に、ファイルをコピーする場合は、cp
オプションを指定します。フォルダを再帰的にコピーする場合は、rsync
を使います。
ファイルを指定指定して S3 にコピーする
s3
で、cp
オプションを指定します。コピーするファイル・保存先の順に指定します。ちなみに、S3からファイルをダウンロードする場合も同様の書き方(S3のファイル・保存先の順)になります。
# aws s3 cp コピーしたいファイル s3の保存先 aws s3 cp aaa.txt s3://bioinfo-dojo/
フォルダを指定して S3 に再帰的にコピーする
s3
で、sync
またはcp
オプションを指定します。再帰的にファイルが検索されて S3 に保存されますが、S3 側では階層構造が無視されるようです。tar
コマンドを使ってアーカイブを作成して保存する方が使い勝手が良いかもしれません。
# aws s3 cp コピーしたいファイル s3の保存先 aws s3 sync myfolder s3://bioinfo-dojo/myfolder_s3 # または aws s3 cp --recursive myfolder s3://bioinfo-dojo/myfolder_s3
実践:crontab で Amazon S3 へのバックアップ
S3へのバックアップスクリプト
my_backup_s3.sh
aws s3 cp ~/work/aaa.txt s3://bioinfo-dojo/
実行権限を付与しておきます。
chmod +x my_backup_s3.sh
crontabの設定
# 分 時 日 月 曜 実行スクリプト・コマンド 35 1 * * * ~/my_backup_s3.sh # 1時35分にバックアップ処理
実行結果
成功しました。指定した時間に、バックアップスクリプトが呼ばれて、指定したファイルが S3 に保存されました。
crontab が動作しないとき
crontab に設定を正しく記述しても、うまく動作しないときがあります。よくあるミスや確認方法などをまとめました。
スクリプトの場所を確認する
crontab の最後に書いたスクリプトの場所に間違いがないかを確認します。よくある間違いは、相対パス・絶対パスの指定ミス。実行すべきファイルが見つからないと、エラーになります。
# 分 時 日 月 曜 実行スクリプト・コマンド 0 15 * * * ~/my_backup_s3.sh # スクリプトの配置場所は正しいか?
動作時間
自分のPCなら時刻を間違うことはないと思いますが、海外のサーバーなどを利用しているとたまに設定ミスをすることがあります。
$ date # 時刻の確認
実行権限を確認する
実行権限がないと、実行時のエラーでcrontabの設定内容が実行されません。
実行権限の確認
$ ls -l *.sh
-rwxrwxr-x 1 my_backup_s3.sh* # 実行権限あり
-rw-rw-r-- 1 my_backup_s3_2.sh # 実行権限なし
実行権限の付与
$ chmod +x ~/my_backup_s3_2.sh
cronの状態を確認する
cron
サービスが稼働していないと、crontabに書かれている内容も実行されません。cron
サービスがActiveになっているかを確認しましょう。
サービス稼働中
$ service cron status
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: active (running)
...
サービス停止中
$ service cron status
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: inactive (dead)
...
cron サービスの開始
cron
サービスが停止中であれば、cron
サービスをスタートさせます。
$ sudo service cron start $
ログを確認する
crontabで実行するスクリプトで、ログを出力すると良いです。エラーが発生したとき理由を特定しやすくなります。
# 実行スクリプトでログ出力を指示 0 15 * * * ~/my_backup_s3.sh > ~/my_backup.log 2>&1 # ログを確認 $ cat my_backup.log # 例:指定したスクリプトファイルが存在しなかった場合 /bin/sh: 1: /home/ubuntu/my_backup_s3_2.sh: not found # 例:指定したスクリプトファイルに実行権限がなかった場合 /bin/sh: 1: /home/ubuntu/my_backup_s3_2.sh: Permission denied