MacのHomebrewのアップデートを、cronで自動化する
Macでcronを使って、Homebrewのアップデートを自動化してみました。
作業したことをメモしておきます。
なお、このエントリでは、それぞれの見出しごとに関連しそうな参照リンクを書く形式にしています。
cronの設定前にすること
事前に設定が必要なことがいくつかあります。
この設定をしていないと、cronを登録しても保存されずに、エラーで終了してしまうので、先に設定を済ましておきましょう。
- Editorの設定を行います(使っているシェルに合わせて、任意のエディタを設定)
# .zshrcなどシェルの設定ファイル export EDITOR=vim
- 上記でエディタをVimにした場合は、バックアップファイルを作成しないようにしておきましょう
" .vimrc set backupskip=/tmp/*,/private/tmp/*
cronの設定を行う
crontab
コマンドを使用します(cron tableの略)crontab -e
で編集が行えるのですが、タイポによる設定の削除を防ぐために、以下の方法を使うことが推奨です- タイポによる削除は、この辺りを参照 crontab -r を安全にする - Kentaro Kuribayashi's blog
crontab -l > 任意のパス/crontab # 現在のcronの設定を、任意のパスに書き出す vim 任意のパス/crontab # 上記の書き出したcronを編集 crontab < 任意のパス/crontab # 編集したcronを、実行するcronに反映する
- さらに、gitなどを使って、バージョン管理しておけば、crontabを削除しても大丈夫なので、やっておきましょう
cronの書式
- いよいよcronの設定を行うのですが、書式は次の形になっています
分 時 日 月 曜日 (実行ユーザー名) cronで実行したいコマンド・スクリプト
ここまでやれば、設定は完了です。
後は設定した時間が来れば、実行されるはず!なのですが、うまく行かなかった人(私です・・・)のために、デバッグ方法や、ハマりそうなポイントを書いておきます。
うまくいかない時は?
デバッグする時は、出力をファイルにリダイレクトして確認する
- 自分の実行したいコマンドに、
1>&2
をつけるなどして、エラー出力をリダイレクトするようにしましょう
- 自分の実行したいコマンドに、
パス指定は絶対パスにしましょう
- ターミナルから実行したら動くのに、cronから動かない!という場合に疑いたい部分です
- crontabにパスを通すというのも有効です(個別のスクリプトで通してもいいのですが、crontab自体に書いてしまった方が、どのcronでも有効になるので汎用性が高そうです)
おまけ
#!/bin/sh log_name=任意のログの絶対パス/`date "+%Y%m%d_%H%M%S"`.log echo 'brew doctor ---------------------------------------------------' >> ${log_name} 2>&1 brew doctor >> ${log_name} 2>&1 if [ $? -ne 0 ]; then echo 'brew update ---------------------------------------------------' >> ${log_name} 2>&1 brew update >> ${log_name} 2>&1 echo 'brew upgrade --------------------------------------------------' >> ${log_name} 2>&1 brew upgrade >> ${log_name} 2>&1 echo 'brew cleanup --------------------------------------------------' >> ${log_name} 2>&1 brew cleanup >> ${log_name} 2>&1 fi