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 への移行編に続きます。