systemd で引数を使う
@:アットマークを使えば、ユニットのテンプレート化で似たようなサービスをまとめることができる。
systemd の list-units をすると、user@1001.service
のように、ユニット名@値
でいくつも起動しているので、自分でもそれを作って使えるようにしてみる。
テンプレート化された systemd ユニットの例
一番手軽に確認できるのは、 ユーザー毎の systemd だと思います。
systemctl --user status
これで確認すると、ユーザーの id ごとのジョブになっていることがわかります。
user@1001.service の設定元は、次のようなファイルです。ユニットのファイル名に@アットマークを入れることでテンプレートを明示しているみたいです。
user@.service
実際に作ってみる。
今回は、システム全体ではなく、ユーザー毎のsystemd で試してみたいと思います。
ユーザーごとの systemd ユニットは、過去の記事に書きました。 → ユーザー毎の systemd を使ってシステム全体設定と個人用設定を分ける
ファイルの作成をします。
ユーザー空間に、ユニットファイルを作成します。
mkdir -p ~/.config/systemd/user/ touch ~/.config/systemd/user/my-loop-template@.service
このときに、名前に@ アットマーク
を入れるのがポイントです。
my-loop-template@.serviceを編集します。
%i が引数として処理されます。
[Unit] Description=テンプレートなサービスを作成する練習。 %i 秒スリープします [Service] ExecStart=bash -c 'while : ; do echo loop ; sleep %i ;done ' [Install] WantedBy=default.target
テンプレートを実際のユニットとして登録します。
systemctl --user enable my-loop-template@10.service
すると、次のようなリンクが作られて、systemd ユニットが作成されたメッセージが出てきます。
Created symlink /home/takuya/.config/systemd/user/default.target.wants/my-loop-template@10.service → /home/takuya/.config/systemd/user/my-loop-template@.service.
サービスを開始します。
systemctl --user start my-loop-template@10.service
状態を確認します。
systemctl --user start my-loop-template@10.service
無事に、引数を決めたサービスが起動しているのがわかりす。これで引数つ変えるようになりました。
似たようなサービスをまとめて管理できることがわかります。
もうひとつ起動してみます。
テンプレートとして動作しているのを確認するために、もう一つのサービスを作りながら、手順をおさらいします。
takuya@vps:~$ systemctl --user start my-loop-template@100.service takuya@vps:~$ systemctl --user status my-loop-template@100.service ● my-loop-template@100.service - テンプレートなサービスを作成する練習。 100 秒スリープします Loaded: loaded (/home/takuya/.config/systemd/user/my-loop-template@.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2020-09-24 17:50:57 JST; 4s ago Main PID: 224128 (bash) CGroup: /user.slice/user-1001.slice/user@1001.service/my\x2dloop\x2dtemplate.slice/my-loop-template@100.service ├─224128 /usr/bin/bash -c while : ; do echo loop ; sleep 100 ;done └─224129 sleep 100 Sep 24 17:50:57 vps systemd[223671]: Started テンプレートなサービスを作成する練習。 100 秒スリープします. Sep 24 17:50:57 vps bash[224128]: %
アットマークを複数入れてた場合
複数の@マークをいれれば、2つ使えるとかそんなこともないようです。
タイマーで使う場合。
timer ユニットで使う場合は、どうなるでしょうか。試してみたいと思います。
結論を先に言えば、timer ユニットで使う場合は、一つずつサービスを起動は不要でした。
タイマーユニットを作成します。
@を名前に入れてテンプレートで作成しますします。
~/.config/systemd/user/my-loop-template@.timer
[Unit] Description=My %i timer Sample [Timer] OnCalendar=minutely RandomizedDelaySec=20 Unit=my-loop-template@%i.service [Install] WantedBy=default.target
タイマーユニットを有効にします。
タイマーユニットを引数付きで開始します。
systemctl --user start my-loop-template@100.timer
すると、サービス側も有効になっていることがわかります。