ちょっとした雑なスクリプト書いてそれを常に起動しておきたいときないですか?僕はあります。
しかもめんどくさがり屋なので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
%h
はsystemd
が定義しいる置き換え文字でユーザーのホームディレクトリになる
で、実行するファイルの中で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
をユーザーレベルで使えばよい。そうすればログイン時に起動するデーモン作れる。