生成されたプロセスが終了したら、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_ctmag
systemdはすべてを再開しますが、殺すとp_ctmat
そうではありません。
または、p_ctmat
opensの後に127.0.0.1:7035
systemdがこのポートを監視し、シャットダウン時にサービスを再起動できますか?
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-ag
and 周囲のラッパーに過ぎず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_ctmag
systemd
今のように再起動しますp_ctmat
p_ctmag
でWATCHDOG_ENABLED Y
再起動しますp_ctmatw
p_ctmat
今のように再起動します