systemd は死んだデーモンプロセスを検出しません

systemd は死んだデーモンプロセスを検出しません

私はaaa.serviceJBossを制御するファイルを持っていますが、そこには他の通常のものに加えて、

[Service]
Type=forking
ExecStart=/my/script start
ExecReload=/my/script restart
ExecStop=/my/script stop
PIDFile=...

/my/script startPID ファイルを作成し、service aaa status奇妙な警告を表示します。

Supervising process xxx which is not our child. We'll most likely not notice when it exits.

フル出力:

   Loaded: loaded (/etc/systemd/system/aaa.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2019-01-22 20:55:16 CET; 34min ago
  Process: 32435 ExecStart=/my/script start (code=exited, status=0/SUCCESS)
 Main PID: 32542
    Tasks: 0 (limit: 512)
   CGroup: /system.slice/aaa.service

Jan 22 20:54:56 I011-830 su[32447]: (to aaa) root on none
Jan 22 20:54:56 I011-830 su[32447]: pam_unix(su-l:session): session opened for user aaa by (uid=0)
Jan 22 20:55:16 I011-830 aaa[32435]: Starting JBoss application server: Starting JBoss application server:
Jan 22 20:55:16 I011-830 systemd[1]: aaa.service: Supervising process 32542 which is not our child. We'll most likely not notice when it exits.

私の実際の問題は、 を発行する以外の方法でプロセスが強制終了された場合service aaa stop、systemd がそれを検出しないことです。さらに、プロセスは実行中であり、再起動したくないと主張します。

# cat <pid-file>
No such file or directory
# service aaa status
   Loaded: loaded (/etc/systemd/system/aaa.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2019-01-22 20:55:16 CET; 40min ago
  Process: 32435 ExecStart=/konsens/app/aaa/init/aaastart (code=exited, status=0/SUCCESS)
 Main PID: 32542
    Tasks: 0 (limit: 512)
   CGroup: /system.slice/aaa.service
 ...
# service aaa start
# <--- Instant return, no process started

次の目標を達成するにはどうすればよいでしょうか?

  • systemdはサービスを開始および停止できるはずです
  • service aaa statussystemdによって開始されたか手動で実行されたかに関係なく、プロセスのステータスが表示されます。/my/service start
  • systemdは手動で強制終了された後でもサービスを開始できるはずです
  • systemdは手動で開始したサービスを停止できるはずです

答え1

以下の目標を達成するにはどうすればいいでしょうか? 1 systemdはサービスを開始および停止できる必要があります

ほとんどのディストリビューションには下位互換性があるため、ネイティブ サービスを作成したくない場合は、サービスを /etc/init.d/ に保存できます。

2 service aaa statusは、systemdによって開始されたか、手動で/my/service startを発行したかに関係なく、プロセスのステータスを表示します。

これを行う 1 つの方法は、systemctl start aaa.service最初にその方法で呼び出されなかった場合に を呼び出すためのチェックをスクリプトに追加することです。トラップは終了に使用できます。

3 systemdは手動で強制終了された後でもサービスを開始できるはずです

#2 によって解決されました

4 systemdは手動で開始したサービスを停止できるはずです

#2 によって解決されました

関連情報