systemdはサービスが停止したかどうかを判断しますか?

systemdはサービスが停止したかどうかを判断しますか?

私たちのアプリケーションはinit.dスクリプトを使用してアプリケーションをサービスとして起動および停止します。 CentOS 7では/sbin/initシンボリックリンクはsystemdなので、次のいずれかを使用してアプリケーションを起動できます。

service myapp start

または

systemctl start myapp

私が経験している問題は、サービスを使用したりstopサービスを実行してもアプリケーションが停止しないことです。出力:servicesystemctlsystemctl status

[root@nec04 ~]# systemctl status myapp
myapp.service - SYSV: Service script to start/stop my application
   Loaded: loaded (/etc/rc.d/init.d/myapp)
   Active: inactive (dead) since Mon 2015-10-05 15:17:41 CEST; 22h ago
  Process: 31850 ExecStop=/etc/rc.d/init.d/myapp stop (code=exited, status=0/SUCCESS)
  Process: 21054 ExecStart=/etc/rc.d/init.d/myapp start (code=exited, status=0/SUCCESS)

使用serviceコマンド:

[root@nec04 ~]# service myapp status
Local database at :3307 is started
Watchdog is running
Application is running

私のアプリケーションがなぜsystemctl実行されないと思いますか?私のアプリケーションが停止したと思ったので、systemctlは停止機能を呼び出しませんでしたか?

ベストアンサー1

出力がわからず、service実際にツールを使用したことはありませんが、systemctlアプリケーションによっては停止しました。これがこのActive: inactive (dead)行が意味するものです。 (Loaded単にsystemdがユニットファイルをメモリにロードしたということです。これはアプリケーションが実行されているかどうかにかかわらず常にそうです。)

アプリケーションに実際にまだ実行中のプロセスがある場合、これは停止機能が正しく機能しないことを意味します。しかし、これは起こってはいけません。何かsystemctlが停止したら(タイムアウト後)、cgroupを使用してそのアプリケーションで起動されたすべてのプロセスを強制終了します。したがって、プロセスがrootとして実行され、意図的にcgroupを離れない限り(非常に病理的な動作)、systemdはそれを終了する必要があります。しかし、sysVinitエミュレーションとどのようにやり取りするのかわかりません。

全体的な問題は、sysVinitエミュレーションを使用するsystemdがinitスクリプトをユニットファイルとして使用するという事実によって複雑になります。前述のように、適切な単位ファイルに書き直す方が良いかもしれません。ここType=simpleプログラムがdbusと会話するよりもスイッチやそれに対応する機能を持つ方が一般的で制御可能なType=dbusコードに追加する方が簡単なので、代わりに使用することをお勧めします。--no-daemon

おすすめ記事