私たちのアプリケーションはinit.dスクリプトを使用してアプリケーションをサービスとして起動および停止します。 CentOS 7では/sbin/init
シンボリックリンクはsystemdなので、次のいずれかを使用してアプリケーションを起動できます。
service myapp start
または
systemctl start myapp
私が経験している問題は、サービスを使用したりstop
サービスを実行してもアプリケーションが停止しないことです。出力:service
systemctl
systemctl 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