web-dev-qa-db-ja.com

systemdサービスファイルが生成されると、initサービスが有効になりません

Systemd環境内の起動時にsysVinitサービスが正しくオンラインにならない問題のトラブルシューティングを行っています。私が見つけたのは、そのサービスの/ etc/systemd/system /にサービスファイルまたはオーバーライドが存在しない場合、適切に自動起動することです。この場合、私が理解しているように、systemdは、システムに存在する「レガシー」sysvinitスクリプトを読み取ることで起動スクリプトを動的にロードしているはずですが、100%明確ではありません。

混乱しているのは、このサービスのsystemctlにedit --fullオプションを渡すとすぐに、フラットファイルが/ etc/systemd/system /に生成され、起動時にサービスが自動起動しなくなることです。編集オプションを使用してオーバーライドを追加しようとすると、サービスの起動に失敗するようにも見えます。

必要に応じて、以下に例を示します...

動作するシステムの例:

この例では「ProgramExample」というサービスのinitスクリプトが/etc/init.d/programexampleと/etc/rc.d/init.d/programexampleに配置されています。

[root@centos7-box ~]# ls -l /etc/rc.d/init.d/programexample
-rwxr-xr-x. 1 root root 2264 Mar 29 14:11 /etc/rc.d/init.d/programexample

/ etc/systemd/system /にサービスファイルがありません:

[root@centos7-box ~]# ls -lh /etc/systemd/system/programexample.service
ls: cannot access /etc/systemd/system/programexample.service: No such file or directory

この構成のSystemctlステータス出力:

[root@centos7-box ~]# systemctl status programexample.service
● programexample.service - LSB: Start Program Example at boot time
   Loaded: loaded (/etc/rc.d/init.d/programexample; bad; vendor preset: disabled)
   Active: active (exited) since Wed 2017-03-29 15:53:06 CDT; 14min ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1297 ExecStart=/etc/rc.d/init.d/programexample start (code=exited, status=0/SUCCESS)

Mar 29 15:53:05 centos7-box systemd[1]: Starting LSB: Start ProgramExample at boot time...
Mar 29 15:53:05 centos7-box su[1307]: (to programexample) root on none
Mar 29 15:53:06 centos7-box programexample[1297]: ProgramExample (user programexample): instance name set to centos7-box
Mar 29 15:53:06 centos7-box programexample[1297]: instance public base uri set to https://192.168.0.148.programexample.net/programexample/
Mar 29 15:53:06 centos7-box programexample[1297]: instance timezone set to US/Central
Mar 29 15:53:06 centos7-box programexample[1297]: starting Java services
Mar 29 15:53:06 centos7-box programexample[1297]: ProgEx server started.
Mar 29 15:53:06 centos7-box systemd[1]: Started LSB: Start ProgramExample at boot time.

上記の構成では、ファイルが/ etc/systemd/system /に作成/配置されていない場合、ProgramExampleサービスは適切に自動起動します。

systemctl edit --full(または単にedit)が使用されると:

編集がsystemctlに渡されると、次のことが確認されました。

  • フラットファイルまたはオーバーライドディレクトリは/ etc/systemd/system /に配置されます
  • このサービス(この場合はProgramExample)は、起動時に開始できません。
  • Systemctlを使用して上記のサービスを「有効化」できなくなります

この構成でのSystemctlステータス出力(編集後):

[root@centos7-box ~]# systemctl status programexample.service
● programexample.service - LSB: Start ProgramExample at boot time
   Loaded: loaded (/etc/rc.d/init.d/programexample; static; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:systemd-sysv-generator(8)

これは、-edit --fullオプションを使用したときに生成され、/ etc/systemd/system /に配置されるサービスファイルです。

# Automatically generated by systemd-sysv-generator

[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/rc.d/init.d/programexample
Description=LSB: Start ProgramExample at boot time
Before=runlevel2.target
Before=runlevel3.target
Before=runlevel4.target
Before=runlevel5.target
Before=shutdown.target
Before=adsm.service
After=all.target
After=network-online.target
After=postgresql-9.4.service
Conflicts=shutdown.target

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
ExecStart=/etc/rc.d/init.d/programexample start
ExecStop=/etc/rc.d/init.d/programexample stop
ExecReload=/etc/rc.d/init.d/programexample reload

ここで何が起きてるの?/etc/systemd/system /のフラットサービスファイルやサービスオーバーライドディレクトリがない場合、systemdがこのサービスのinitスクリプトからこの情報を動的に読み取っていることを修正できますか?/etc/systemd/system /にあるサービスファイルを編集し、デフォルトファイルをそのままにして、自動起動が機能しない、またはサービスが「有効」状態にならないように、何度も繰り返し試しました。

互換性と同時実行性の理由から、initdスクリプトのLSBヘッダーから読み取るためにsystemdに依存するのではなく、systemd構成用のsystemd .serviceファイルを用意することが望ましいと思いますが、systemdが作成しているデフォルトのファイルは、他の多くのファイルとともに起動または有効化できません私が試みた.serviceファイルのより単純な反復。

5
Toby

Systemd-sysv-generatorによって自動的に生成されたサービスファイルに、WantedByオプションのインストールセクションがないことが問題であることがわかりました。 /etc/systemd/system/programexample.serviceにある生成されたファイルに以下を追加しました。これにより、サービスを適切に有効にできます。

[Install]
WantedBy = multi-user.target

その後走った

systemctl daemon-reload

systemdがサービスファイルを読み取ったことを確認します。

現在、私のサービスが実際にシンボリックリンクされて「有効」になっているという適切な通知を受け取りました。

[root@centos7-box ~]# systemctl enable programexample.service
Created symlink from /etc/systemd/system/multi-user.target.wants/programexample.service to /etc/systemd/system/programexample.service.

このリンク は、サービスファイルをよりよく理解するのに役立ちました。

私は、systemd-sysv-generatorにデフォルトでWantedByオプションを含むインストールセクションが含まれていない方法のファンではありません。 systemdが動的にLSBヘッダーを読み取り、起動時にサービスを適切に開始できる場合、それに応じてサービスファイルが生成されないのはなぜですか?システム化されたいくつかの成長する痛みが予想されると思います。

7
Toby