systemd:分岐したプロセスが終了したら、サービスを再起動します。

systemd:分岐したプロセスが終了したら、サービスを再起動します。

生成されたプロセスが終了したら、systemdサービスを自動的に再起動する方法はありますか?

Control-Mのシステム単位ファイルを作成した後

[Unit]

After       = network-online.target
After       = remote-fs.target
Description = Control-M agent
Wants       = network-online.target

[Service]

ExecStart   = /opt/ctmagent/ctm/scripts/start-ag -u ctmagent -p ALL
ExecStop    = /opt/ctmagent/ctm/scripts/shut-ag -u ctmagent -p ALL
Restart     = always
RestartSec  = 5
TimeoutSec  = 5min
Type        = forking

[Install]

WantedBy = multi-user.target

私はそれが3つの異なるプロセスを分岐したことを発見しました。

# systemctl status ctmag.service

CGroup: /system.slice/ctmag.service
   ├─129041 /opt/ctmagent/ctm/exe/p_ctmag
   ├─129089 /opt/ctmagent/ctm/exe/p_ctmat
   └─129091 /opt/ctmagent/ctm/exe/p_ctmatw -ATW_NAME ATW000

を殺すとp_ctmagsystemdはすべてを再開しますが、殺すとp_ctmatそうではありません。

または、p_ctmatopensの後に127.0.0.1:7035systemdがこのポートを監視し、シャットダウン時にサービスを再起動できますか?


PS1:そうです。いいえを制御できるstart-agのでshut-ag制御グループのプロセスの 1 つが失敗すると、Systemd はサービスを再起動します。ここでは役に立ちません。

PS2:また、他のスクリプト「レイヤー」の中にスクリプトを含む他のスクリプト「レイヤー」を追加することはできません。純粋なシステム単位のファイルソリューションが必要です。

答え1

問題は、BMCがControl-M / Agentの基本システムサービスファイルを構築していないことです。これ9.0.18.200 バージョンインストールガイド)(ログインが必要です)systemd-systemsの場合は、このテンプレートでサービスファイルを使用するように指示します。

[Unit]
Description=Control-M Agent

[Service]
Type=forking
RemainAfterExit=yes
ExecStart=[agent_home_dir]/ctm/scripts/rc.agent_user start
ExecStop=[agent_home_dir]/ctm/scripts/rc.agent_user stop

[Install]
WantedBy=multi-user.target

...Exec 行は単にstart-agand 周囲のラッパーに過ぎずshut-ag、これはあなたが使っているものです。問題はforking、実際には、「サービス」(起動スクリプト)が複数のプロセスを開始したときにこれがサービスの種類であることをsystemdに通知することで発生します。 systemdは、最初のスクリプトの後の最初のサブプロセスを確認すると、サービスが成功したと見なします(ポーキング)。p_ctmagご覧のとおり、プロセスは終了します。出力はsystemctl status明確です。

Process: 6519 ExecStart=/opt/ctmagent/ctm/scripts/start-ag -u ctmagent -p ALL (code=exited, status=0/SUCCESS)

...ここでpid 6519はstart-ag終了したスクリプトです。以下は、表示される残りの制御グループプロセスです。

私もここで指摘したいです。システム文書説明する:

この設定を使用する場合は、systemdがサービスの基本プロセスを確実に識別できるように、PIDFile =オプションも使用することをお勧めします。

...推奨BMCサービスファイルが含まれていません。$CONTROLM/pid/;3つのプロセスすべてのPIDファイルをダウンロードします。本物PIDファイルは次のとおりです。名前付きpidではなくpidがその内容だからです。

これが systemd がp_ctmatプロセスを再起動しない理由です。

プロセスを別々に制御されたプロセス(これらのスクリプトによって設定された2つの環境変数を含む)に分割するには、数千行のベンダースクリプトを再構築するか、BMCが便利なシステムスクリプトを提供するのを待つことをお勧めしません。WATCHDOG_ENABLED私のYテストでは、これを使ってプロセスをp_ctmag監視でき、必要に応じてp_ctmat再起動できました。プロセスp_ctmatwはこのプロセスの子プロセスであり、p_ctmat必要p_ctmatwに応じて再起動されます。

ここでは、次のことができます。

  • p_ctmagsystemd今のように再起動します
  • p_ctmatp_ctmagWATCHDOG_ENABLED Y再起動します
  • p_ctmatwp_ctmat今のように再起動します

関連情報