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」の出力で取得できる文字列を使用。 |
以上