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を使用すると、arg1とarg2の間の半角スペースがエスケープされ、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」の出力で取得できる文字列を使用。 |
以上