systemdは死んだデーモンを検出しません。

systemdは死んだデーモンを検出しません。

私はaaa.service他の一般的なものの中から以下を含むファイル(Control JBoss)を持っています。

[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 stopsystemdがそれを検出しないことです。実行していると主張して再起動したくありません。

# 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サービスaaaステータスは、プロセスがsystemdによって開始されたのか、/my/service startで手動で実行されたのかに関係なく、プロセスのステータスを表示する必要があります。

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

3 Systemdは、手動でサービスを終了した後にサービスを開始できる必要があります。

#2で解決しました

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

#2で解決しました

関連情報