docs.ruby-lang.org の環境が Debian GNU/Linux 9.11 (stretch) で、 Debian GNU/Linux 10 (buster) の環境に移行するためにも 動作確認するための環境を作りやすくした方が良いと思って、 vagrant での再現環境構築をすすめています。
今回は cron から systemd timer への移行です。
動作確認環境
- macOS Mojave 10.14.6
- VirtualBox 6.1.2
- Vagrant 2.2.6
- ansible 2.9.3
予定
- 再現環境を作成 : 済み
- cron を systemd timer に移行 : 今回はここ
- Debian 10 に移行
動作確認手順
- VirtualBox, Vagrant, ansible を入れておく
-
vagrant up
して起動 -
vagrant ssh-config >> ~/.ssh/config
でssh default
で接続できるように設定 (初回のみ、他をvagrant up
してポート番号が変わるなどした時は~/.ssh/config
を適宜調整) -
bundle install
でcapistrano
などをインストール -
cap vagrant deploy
またはbundle exec cap vagrant deploy
で https://github.com/ruby/docs.ruby-lang.org と https://github.com/ruby/rurema-search をデプロイ -
vagrant ssh
で入る -
sudo systemctl start rdoc-static-all.service bc-setup-all.service &
でドキュメントの生成を開始 -
sudo systemctl status rdoc-static-all.service bc-setup-all.service bc-static-all.service update-rurema-index.service
で状況を確認-
Active: activating (start) since ...
が実行中 -
Active: inactive (dead) since ...
が実行完了 -
since ...
がないActive: inactive (dead)
はまだ一度も実行されていない -
system/fastly-purge-key
のエラーが出るのは本番環境には存在するファイルが存在しないため、 CDN のキャッシュのパージができないということで、動作確認環境では問題ないため、無視しても大丈夫 - (
sudo
なしだとsystemd-journal
グループに入っていないのでログ以外のステータス表示だけになる)
-
- ブラウザーで
https://localhost:10443/
を開いて (動作確認環境用の自己署名証明書なので) Chrome ならNET::ERR_CERT_AUTHORITY_INVALID
というエラーを無視して開く-
rdoc-static-all.service
が終わっていれば/en/バージョン/
以下が見える -
bc-static-all.service
が終わっていれば/ja/バージョン/
以下が見える -
update-rurema-index.service
が終わっていれば/ja/search/
の検索が完全に使える (実行中でも完全に揃っていないだけで使える)
-
systemd timer の利点
- cron だと環境変数などをそろえるのが難しいのに対して、 systemd だと timer で起動するのと
systemctl start なにか.service
で実行する時で同じ環境になる - cron だとログがメールで飛んで、特に設定をしていないと
/var/spool/mail
にずっとたまり続けるのに対して、 systemd だと journald で他のログと統一的に扱えて、ログのローテートなども自動
systemd timer の欠点
- cron だと crontab に1行追加するだけなのに対して、最低でも service ファイルと timer ファイルの2個追加が必要
- timer の start と enable が必要 (enable を忘れると OS の再起動後に動かなくて、しばらくしてから悩む)
順番に実行するための連携手段
crontab では
20 4 * * * cd /var/www/docs.ruby-lang.org/current; ruby system/rdoc-static-all
15 9 * * * cd /var/www/docs.ruby-lang.org/current; ruby system/bc-setup-all; ruby system/bc-static-all
15 11 * * * cd /var/www/docs.ruby-lang.org/current; system/update-rurema-index
となっていて、 bc-setup-all
と bc-static-all
は順番に実行して、 system/update-rurema-index
はそれとは独立して動いていたのですが、 systemd の service unit としては分離しておいて連続で実行した方が ログの分離や終了ステータスの確認などの点で良さそうだと思ったので、 別 service unit にしました。
そうすると、ある Type=oneshot
の service が完了したら次の service を起動する、という連携が必要になるのですが、 systemd はデーモンの起動が主目的で、 Type=oneshot
のような正常終了した時に何かやりたい、というのに向いた設定はなさそう (OnFailure
という失敗した時に別 service を起動する設定は可能で systemd/Timers - ArchWiki ではエラー時のメール送信に使っている) で、悩んだ末に path unit という inotify でファイルをトリガーにできる unit で連携することにしました。
to be continued
今回の変更は https://github.com/ruby/docs.ruby-lang.org/pull/92 になります。
Debian 10 への移行編に続きます。