超楽にRubyで雑に書いたスクリプトをsystemdで管理したい!

ちょっとした雑なスクリプト書いてそれを常に起動しておきたいときないですか?僕はあります。

しかもめんどくさがり屋なのでghq管理化のディレクトリでgemに頼って雑に書いたスクリプトがそのまま動いてほしいんです。

systemd使えば出来るんだろうなぁと思いつつ「色々面倒くさいんだろうな」と思って手を出していなかったんだけどやってみたら拍子抜けするほど簡単だったので共有です。

雑要件定義

  • rubyはrbenvで管理してるんでそれそのまま使ってほしい
  • 実行ファイルをgit&ghq管理化のディレクトリでそのまま使いたい
    • 他の場所にインストールとかコード管理ダルい
  • bundle exec 的なのもやって依存ライブラリもうまいことやってほしい

やること

systemdをユーザーレベルで使うときは ~/.config/systemd/user/にファイルを置けば良い。ディレクトリ無かったら作る

mkdir -p ~/.config/systemd/user/

そこにsystemd ユニットファイルを作る。例えばhogeっていうプロジェクトならhoge.serviceという名前のファイルを作る。中身はこんな感じ。

[Unit]
Description=hoge

[Service]
Type=simple
Restart=always
Environment="PATH=%h/.rbenv/shims:/usr/local/bin:/usr/bin:/usr/local/sbin:"
ExecStart=%h/src/github.com/yoshiori/hoge/bin/run
WorkingDirectory=%h/src/github.com/yoshiori/hoge

[Install]
WantedBy=default.target
  • Environment
    • ここにPATH設定をかいてrbenvをにもパスを通す。
  • ExecStart
    • 実行するコマンド
  • WorkingDirectory

%hsystemdが定義しいる置き換え文字でユーザーのホームディレクトリになる

で、実行するファイルの中でbundler/setup呼んであげれば良い。

#!/usr/bin/env ruby
# frozen_string_literal: true

require "bundler/setup"

デバッグ

とりあえず実行

systemctl --user start サービス名.service

動かなかったらログ見る

 journalctl --user -eu サービス名.service

修正したらリロード

 systemctl --user daemon-reload     

あとは正常に動くようになるまで微調整

登録

ここまできたらいつものsystemdと使い方変わらない

登録

systemctl --user enable サービス名.service

登録されていることを確認

systemctl --user list-dependencies 

おわり

まとめ

簡単だからsystemdをユーザーレベルで使えばよい。そうすればログイン時に起動するデーモン作れる。