それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

systemd で引数を使う(@:アットマーク)ユニットのテンプレート化で似たようなサービスをまとめる。

systemd で引数を使う

@:アットマークを使えば、ユニットのテンプレート化で似たようなサービスをまとめることができる。

systemd の list-units をすると、user@1001.service のように、ユニット名@値 でいくつも起動しているので、自分でもそれを作って使えるようにしてみる。

テンプレート化された systemd ユニットの例

一番手軽に確認できるのは、 ユーザー毎の systemd だと思います。

 systemctl  --user status

これで確認すると、ユーザーの id ごとのジョブになっていることがわかります。

user@1001.service の設定元は、次のようなファイルです。ユニットのファイル名に@アットマークを入れることでテンプレートを明示しているみたいです。

user@.service

f:id:takuya_1st:20200924174028p:plain

実際に作ってみる。

今回は、システム全体ではなく、ユーザー毎の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

無事に、引数を決めたサービスが起動しているのがわかりす。これで引数つ変えるようになりました。

似たようなサービスをまとめて管理できることがわかります。

f:id:takuya_1st:20200924174836p:plain

もうひとつ起動してみます。

テンプレートとして動作しているのを確認するために、もう一つのサービスを作りながら、手順をおさらいします。

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つ使えるとかそんなこともないようです。 f:id:takuya_1st:20200924180235p:plain

タイマーで使う場合。

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

すると、サービス側も有効になっていることがわかります。

f:id:takuya_1st:20200924183727p:plain

参考資料

redj.hatenablog.com