[ MQ 9.4.4 Oct 2025]

Monitoraggio, riavvio e chiusura delle istanze di queue manager

È necessario implementare un metodo per garantire che le istanze del gestore di code nella configurazione Native HA siano ancora in esecuzione e riavviarle se necessario.

Se un'istanza di replica in un gruppo Native HA si guasta inaspettatamente, a condizione che la maggior parte delle istanze sia ancora disponibile, non vi è alcuna perdita di disponibilità di un gestore di code. È tuttavia importante rilevare e riavviare l'istanza il più rapidamente possibile. Questo argomento fornisce un esempio di come si possa implementare un controllo di "liveness" usando il demone systemd . Quando si utilizza questo metodo, è necessario utilizzare anche systemd per terminare il gestore di code.

Il seguente script python, mqmonitor.py, è fornito in forma sorgente in /opt/mqm/samp. Lo script può avviare, monitorare, arrestare e riavviare un'istanza di queue manager:

#
#   <copyright
#   notice="lm-source-program"
#   pids="5724-H72"
#   years="2026"
#   crc="0" >
#   Licensed Materials - Property of IBM
#
#   5724-H72
#
#   (C) Copyright IBM Corp. 2026 All Rights Reserved.
#
#   US Government Users Restricted Rights - Use, duplication or
#   disclosure restricted by GSA ADP Schedule Contract with
#   IBM Corp.
#   </copyright>
#
#   A sample python script to start, monitor and stop a named queue manager.
#
import argparse
import subprocess
import time

def qmstart(qmgr, mqm_path):
   strmqm = subprocess.run([f"{mqm_path}/bin/strmqm", "-x", qmgr])
   # Allow multi-instance standby and Native HA replica instances also count as success
   if strmqm.returncode in [0, 30, 94]:
       print(f"Started {qmgr}")
   else:
       print(f"Failed to start {qmgr}, rc: {strmqm.returncode}")
def qmstop(qmgr, mqm_path):
   try:
        subprocess.run([f"{mqm_path}/bin/endmqm", "-tp", "29", "-w", qmgr], check=True)
        print(f"Stopped {qmgr}")
   except subprocess.CalledProcessError as e:
        print(f"Failed to stop {qmgr}: {e}")
def qmhealthy(qmgr, mqm_path):
   try:
        output = subprocess.check_output([f"{mqm_path}/bin/dspmq", "-n", "-m", qmgr], universal_newlines=True)
        active_states = ["STATUS(RUNNING)", "STATUS(STARTING)", "STATUS(RUNNING AS STANDBY)",
                         "STATUS(NEGOTIATING)", "STATUS(REPLICA)", "STATUS(RECOVERY GROUP LEADER)"]
        if any(x in output for x in active_states):
            return True
        else:
            return False
   except subprocess.CalledProcessError:
        return False
if __name__ == "__main__":
    MQ_INSTALLATION_PATH="/opt/mqm"
    parser = argparse.ArgumentParser(description="MQ Monitor Service")
    parser.add_argument("--start", action="store_true", help="Start monitoring queue manager")
    parser.add_argument("--stop", action="store_true", help="Stop queue manager and end monitoring")
    parser.add_argument("qmgr", help="Name of queue manager to monitor")
    parser.add_argument("--mqm-path", default=MQ_INSTALLATION_PATH, help="MQ installation path (default " + MQ_INSTALLATION_PATH + ")")
    parser.add_argument("--health-interval", type=int, default=10, help="Healthcheck interval in seconds (default 10)")
    args = parser.parse_args()

    if args.start:
        while True:
            if not qmhealthy(args.qmgr, args.mqm_path):
                qmstart(args.qmgr, args.mqm_path)
            time.sleep(args.health_interval)
    elif args.stop:
        qmstop(args.qmgr, args.mqm_path)
    else:
        print("Usage: python3 mqmonitor.py --[start|stop] <qmgr> [--mqm-path <path>] [--health-interval <seconds>]")

Lo script python mqmonitor.py può essere combinato con il seguente modello di definizione del servizio di sistema mqmonitor@.service, che è anche incluso in /opt/mqm/samp. La copia o il collegamento simbolico della definizione nella directory /etc/systemd/service consente di avviare il servizio dal sistema. È necessario creare il collegamento simbolico come utente ROOT.

#
#   <copyright
#   notice="lm-source-program"
#   pids="5724-H72"
#   years="2026"
#   crc="0" >
#   Licensed Materials - Property of IBM
#
#   5724-H72
#
#   (C) Copyright IBM Corp. 2026 All Rights Reserved.
#
#   US Government Users Restricted Rights - Use, duplication or
#   disclosure restricted by GSA ADP Schedule Contract with
#   IBM Corp.
#   </copyright>
#
#   Copy or symlink this configuration file to /etc/systemd/service and use
#
#   sudo systemctl enable mqmonitor@qmgrname
#
#   to configure a queue manager to start at system boot.
#

 [Unit]
 Description=MQ %I Queue Manager Monitor Service

 [Service]
 User=mqm
 Group=mqm
 Type=simple
 StandardOutput=journal
 StandardError=journal
 SyslogIdentifier=mqmonitor
 Environment=MQ_INSTALLATION_PATH=/opt/mqm
 ExecStart=/usr/bin/python3 ${MQ_INSTALLATION_PATH}/samp/mqmonitor.py --mqm-path ${MQ_INSTALLATION_PATH} --start %I --health-interval 10
 ExecStop=/usr/bin/python3 ${MQ_INSTALLATION_PATH}/samp/mqmonitor.py --mqm-path ${MQ_INSTALLATION_PATH} --stop %I
 TimeoutStopSec=30
 KillMode=mixed
 Restart=always

 [Install]
 WantedBy=multi-user.target
Se si utilizza il percorso di installazione predefinito /opt/mqm e non si desidera modificare il modello o lo script di monitoraggio, è possibile collegare simbolicamente il servizio di esempio utilizzando il seguente comando:
ln -s /opt/mqm/samp/mqmonitor@.service /etc/systemd/system 
È necessario creare il collegamento simbolico come utente ROOT.
È quindi necessario porre il gestore di code sotto il controllo del servizio mqmonitor. Ad esempio, per porre il gestore di code MYQMGR sotto il controllo del servizio, si possono eseguire i seguenti comandi:
sudo systemctl enable mqmonitor@MYQMGR
sudo systemctl start mqmonitor@MYQMGR

Quando viene eseguito sotto il controllo di systemd , lo script python si sveglia ogni dieci secondi ed emette un comando dspmq per verificare che l'istanza del gestore di code sia in uno stato utile. Se lo stato non è accettabile, lo script python tenta di riavviare il gestore delle code.

Chiusura di un gestore di code Native HA

Un gestore di code sotto il controllo di systemd viene controllato ogni dieci secondi dallo script python e riavviato se non si trova in uno stato inaccettabile. Pertanto, l'invio di endmqm per il gestore di code comporta il riavvio del gestore di code da parte dello script python. Se invece si desidera arrestare il gestore di code, utilizzare il comando systemctl stop:
sudo systemctl stop mqmonitor@MYQMGR

Usare systemctl con le opzioni start o restart per avviare il gestore di code.