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/configssh default で接続できるように設定 (初回のみ、他を vagrant up してポート番号が変わるなどした時は ~/.ssh/config を適宜調整)
  • bundle installcapistrano などをインストール
  • cap vagrant deploy または bundle exec cap vagrant deployhttps://github.com/ruby/docs.ruby-lang.orghttps://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-allbc-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 への移行編に続きます。

Disqus Comments

Kazuhiro NISHIYAMA

Ruby のコミッターとかやってます。 フルスタックエンジニア(って何?)かもしれません。 About znzに主なアカウントをまとめました。

znz znz


Published