search
LoginSignup
4
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

systemd の systemctlコマンドでインスタンスを使用して引数を渡す方法

systemctlコマンドでインスタンスを使用して引数を渡す方法を紹介します。

環境

  • OS:CentOS Linux release 7.7.1908

1. Unit定義ファイルを作成

以下のUnit定義ファイルを作成する。

  • サービス名(ここではtest) + @ + .serviceとする。
  • %iを使用する。
/etc/systemd/system/test@.service
[Unit]
Description=TestService

[Service]
ExecStart=/bin/echo %I

2. systemctlコマンドで引数(インスタンス名)を指定して起動

systemctl start test@"arg1 arg2"

[root@CENTOS7 ~]# systemctl start test@"arg1 arg2"
[root@CENTOS7 ~]#

journalctl -u test@"arg1 arg2"で確認。

[root@CENTOS7 ~]# journalctl -u test@"arg1 arg2"
-- Logs begin at 日 2019-12-29 17:19:15 JST, end at 日 2019-12-29 20:06:21 JST.
12月 29 20:06:21 CENTOS7 systemd[1]: Started TestService.
12月 29 20:06:21 CENTOS7 echo[1602]: arg1 arg2

/etc/systemd/system/test@.service%Iではなく%iを使用すると、arg1arg2の間の半角スペースがエスケープされ、arg1\x20arg2となってしまう。

参考

ユニットファイルがロードされる際に置換されるユニット指定子は以下となります。

ユニット指定子 意味 詳細
%n フルユニット名
%N フルユニット名(エスケープなし) %nと同じだが、文字列がエスケープされない。
%p 接頭辞 インスタンスになったユニット名の中の "@" 文字の前の文字列を参照する。
そうでないユニットの場合、接尾辞を除いたユニット名が使用される。
%P 接頭辞(エスケープなし) %pと同じだが、文字列がエスケープされない。
%i インスタンス名 インスタンスになったユニット名の"@" 文字と接尾辞の間の文字列を使用する。
%I インスタンス名(エスケープなし) %iと同じだが、文字列がエスケープされない。
%f ファイル名(エスケープなし) エスケープされていないインスタンス名。
%c ユニットのコントロールグループ このグループ名には、/sys/fs/cgroup/systemd/の接頭辞が含まれない。
%r コントロールグループの親グループのパス "%c"の親のcgroupパスが使用される。
%R スライスとユニットが置かれるルートコントロールグループパス システムインスタンスの場合、「/」になる。
なおコンテナの場合、コンテナのルートコントロールグループパスを使用する。
%t ランタイムディレクトリ /run又は、$XDG_RUNTIME_DIRが使用される。
%u ユーザ名 マネージャーを実行しているユーザのユーザ名が使用される。
通常はroot。
%U ユーザのUID マネージャーを実行しているユーザのUIDが使用される。
システム管理者の場合は0が使用される。
%h ユーザのホームディレクトリ マネージャーを実行しているユーザのホームディレクトリが指定される。
システム管理者の場合は、「/root」が使用される。
%s ユーザのシェル サービスマネージャーが使用しているシェル。
システム管理者の場合は、「/bin/sh」が使用される。
%m マシンID システムのマシンID。
%b Boot ID システムのブートID。
%H ホスト名 ユニットがロードされた時点でのシステムホスト名。
%v kernelのリリースバージョン 「uname -r」の出力で取得できる文字列を使用。

以上

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4
Help us understand the problem. What are the problem?