wei/个人文档/systemd管理zmq进程.md
2026-06-04 13:57:41 +08:00

12 KiB
Raw Blame History

1. 创建包装脚本

1.1 req-zmq-config1 的包装脚本

sudo tee /usr/local/bin/req-zmq-config1-wrapper.sh > /dev/null << 'EOF'
#!/bin/bash
PREFIX="/home/system/service/boyi_req_zmq_relay"
LOG_DIR="$PREFIX/logs"
DATE=$(date +%Y%m%d)
LOG_FILE="$LOG_DIR/zmq_relay_1_$DATE.log"

mkdir -p "$LOG_DIR"
cd "$PREFIX"
exec /home/anaconda3/bin/python "$PREFIX/zmq_relay.py" config1.conf >> "$LOG_FILE" 2>&1
EOF
sudo chmod +x /usr/local/bin/req-zmq-config1-wrapper.sh

1.2 req-zmq-config2 的包装脚本

sudo tee /usr/local/bin/req-zmq-config2-wrapper.sh > /dev/null << 'EOF'
#!/bin/bash
PREFIX="/home/system/service/boyi_req_zmq_relay"
LOG_DIR="$PREFIX/logs"
DATE=$(date +%Y%m%d)
LOG_FILE="$LOG_DIR/zmq_relay_2_$DATE.log"

mkdir -p "$LOG_DIR"
cd "$PREFIX"
exec /home/anaconda3/bin/python "$PREFIX/zmq_relay.py" config2.conf >> "$LOG_FILE" 2>&1
EOF
sudo chmod +x /usr/local/bin/req-zmq-config2-wrapper.sh

1.3 resp-zmq 的包装脚本

sudo tee /usr/local/bin/resp-zmq-wrapper.sh > /dev/null << 'EOF'
#!/bin/bash
PREFIX="/home/system/service/boyi_resp_zmq_relay"
LOG_DIR="$PREFIX/logs"
DATE=$(date +%Y%m%d)
LOG_FILE="$LOG_DIR/zmq_relay_$DATE.log"

mkdir -p "$LOG_DIR"
cd "$PREFIX"
exec /home/anaconda3/bin/python "$PREFIX/zmq_relay.py" >> "$LOG_FILE" 2>&1
EOF
sudo chmod +x /usr/local/bin/resp-zmq-wrapper.sh

1.4 risk-control-zmq 的包装脚本

sudo tee /usr/local/bin/risk-control-zmq-wrapper.sh > /dev/null << 'EOF'
#!/bin/bash
PREFIX="/home/system/service/boyi_req_zmq_risk_control"
LOG_DIR="$PREFIX/logs"
DATE=$(date +%Y%m%d)
LOG_FILE="$LOG_DIR/zmq_relay_$DATE.log"

mkdir -p "$LOG_DIR"
cd "$PREFIX"
exec /home/anaconda3/bin/python "$PREFIX/zmq_relay.py" >> "$LOG_FILE" 2>&1
EOF
sudo chmod +x /usr/local/bin/risk-control-zmq-wrapper.sh

2. 创建 systemd 服务文件

2.1 req-zmq-config1.service

sudo tee /etc/systemd/system/req-zmq-config1.service > /dev/null << 'EOF'
[Unit]
Description=BoYi ZMQ Relay Service (Requester Config1)
After=network.target
Wants=network.target

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/home/system/service/boyi_req_zmq_relay
Environment=PYTHONPATH=/home/system/service/boyi_req_zmq_relay

# 使用包装脚本启动
ExecStart=/usr/local/bin/req-zmq-config1-wrapper.sh

# 进程监控和重启配置
Restart=always
RestartSec=10
StartLimitInterval=0
StartLimitBurst=5

# 资源限制(可选)
MemoryLimit=512M
CPUQuota=100%

# 信号处理
KillMode=process
KillSignal=SIGTERM
TimeoutStopSec=30
SendSIGKILL=yes

# 日志配置 - 不输出到journal只输出到文件
StandardOutput=null
StandardError=null
SyslogIdentifier=req-zmq-config1

[Install]
WantedBy=multi-user.target
EOF

2.2 req-zmq-config2.service

sudo tee /etc/systemd/system/req-zmq-config2.service > /dev/null << 'EOF'
[Unit]
Description=BoYi ZMQ Relay Service (Requester Config2)
After=network.target
Wants=network.target

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/home/system/service/boyi_req_zmq_relay
Environment=PYTHONPATH=/home/system/service/boyi_req_zmq_relay

# 使用包装脚本启动
ExecStart=/usr/local/bin/req-zmq-config2-wrapper.sh

# 进程监控和重启配置
Restart=always
RestartSec=10
StartLimitInterval=0
StartLimitBurst=5

# 资源限制(可选)
MemoryLimit=512M
CPUQuota=100%

# 信号处理
KillMode=process
KillSignal=SIGTERM
TimeoutStopSec=30
SendSIGKILL=yes

# 日志配置 - 不输出到journal只输出到文件
StandardOutput=null
StandardError=null
SyslogIdentifier=req-zmq-config2

[Install]
WantedBy=multi-user.target
EOF

2.3 resp-zmq.service

sudo tee /etc/systemd/system/resp-zmq.service > /dev/null << 'EOF'
[Unit]
Description=BoYi ZMQ Relay Service (Responder)
After=network.target
Wants=network.target

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/home/system/service/boyi_resp_zmq_relay
Environment=PYTHONPATH=/home/system/service/boyi_resp_zmq_relay

# 使用包装脚本启动
ExecStart=/usr/local/bin/resp-zmq-wrapper.sh

# 进程监控和重启配置
Restart=always
RestartSec=10
StartLimitInterval=0
StartLimitBurst=5

# 资源限制(可选)
MemoryLimit=512M
CPUQuota=100%

# 信号处理
KillMode=process
KillSignal=SIGTERM
TimeoutStopSec=30
SendSIGKILL=yes

# 日志配置 - 不输出到journal只输出到文件
StandardOutput=null
StandardError=null
SyslogIdentifier=resp-zmq

[Install]
WantedBy=multi-user.target
EOF

2.4 risk-control-zmq.service

sudo tee /etc/systemd/system/risk-control-zmq.service > /dev/null << 'EOF'
[Unit]
Description=BoYi ZMQ Risk Control Service
After=network.target
Wants=network.target

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/home/system/service/boyi_req_zmq_risk_control
Environment=PYTHONPATH=/home/system/service/boyi_req_zmq_risk_control

# 使用包装脚本启动
ExecStart=/usr/local/bin/risk-control-zmq-wrapper.sh

# 进程监控和重启配置
Restart=always
RestartSec=10
StartLimitInterval=0
StartLimitBurst=5

# 资源限制(可选)
MemoryLimit=512M
CPUQuota=100%

# 信号处理
KillMode=process
KillSignal=SIGTERM
TimeoutStopSec=30
SendSIGKILL=yes

# 日志配置 - 不输出到journal只输出到文件
StandardOutput=null
StandardError=null
SyslogIdentifier=risk-control-zmq

[Install]
WantedBy=multi-user.target
EOF

3. 创建日志轮转配置

sudo tee /etc/logrotate.d/zmq-services-dated > /dev/null << 'EOF'
/home/system/service/boyi_req_zmq_relay/logs/zmq_relay_*.log
/home/system/service/boyi_resp_zmq_relay/logs/zmq_relay_*.log
/home/system/service/boyi_req_zmq_risk_control/logs/zmq_relay_*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 644 root root
    dateext
    dateformat .%Y%m%d
    sharedscripts
    postrotate
        # 重新加载服务以使用新的日志文件
        systemctl kill -s HUP req-zmq-config1.service >/dev/null 2>&1 || true
        systemctl kill -s HUP req-zmq-config2.service >/dev/null 2>&1 || true
        systemctl kill -s HUP resp-zmq.service >/dev/null 2>&1 || true
        systemctl kill -s HUP risk-control-zmq.service >/dev/null 2>&1 || true
    endscript
}
EOF

4. 部署和测试

# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 停止旧服务(如果存在)
sudo systemctl stop req-zmq-config1 req-zmq-config2 resp-zmq risk-control-zmq 2>/dev/null

# 创建日志目录
mkdir -p /home/system/service/boyi_req_zmq_relay/logs
mkdir -p /home/system/service/boyi_resp_zmq_relay/logs
mkdir -p /home/system/service/boyi_req_zmq_risk_control/logs

# 启动所有服务
sudo systemctl start req-zmq-config1
sudo systemctl start req-zmq-config2
sudo systemctl start resp-zmq
sudo systemctl start risk-control-zmq

# 查看服务状态
sudo systemctl status req-zmq-config1 req-zmq-config2 resp-zmq risk-control-zmq

# 设置开机自启动
sudo systemctl enable req-zmq-config1 req-zmq-config2 resp-zmq risk-control-zmq

四个服务的日志路径:

  • /home/system/service/boyi_req_zmq_relay/logs/zmq_relay_1_YYYYMMDD.log
  • /home/system/service/boyi_req_zmq_relay/logs/zmq_relay_2_YYYYMMDD.log
  • /home/system/service/boyi_resp_zmq_relay/logs/zmq_relay_YYYYMMDD.log
  • /home/system/service/boyi_req_zmq_risk_control/logs/zmq_relay_YYYYMMDD.log

5. 进程监控脚本

/home/system/zabbix_agent/ps/check_zmq_ps.sh

#!/bin/bash
# 直接监控四个指定的zmq进程

# 定义要监控的进程列表
declare -a processes=(
    "/home/system/service/boyi_req_zmq_relay/zmq_relay.py config1.conf"
    "/home/system/service/boyi_resp_zmq_relay/zmq_relay.py"
    "/home/system/service/boyi_req_zmq_relay/zmq_relay.py config2.conf"
    "/home/system/service/boyi_req_zmq_risk_control/zmq_relay.py"
)

# 初始化错误数组
array_error=()

# 遍历每个进程进行检查
for process_cmd in "${processes[@]}"; do
    # 提取Python脚本路径去掉可能的参数
    python_script=$(echo "$process_cmd" | awk '{print $1}')
    
    # 检查进程是否存在
    actual_count=$(ps -ef | grep -v grep | grep -c "$process_cmd")
    
    # 检查进程状态(每个进程应该至少有一个实例在运行)
    if [[ $actual_count -eq 0 ]]; then
        # 进程不存在
        array_error+=("$process_cmd (0/1)")
    elif [[ $actual_count -gt 1 ]]; then
        # 有多个相同进程(可能异常)
        array_error+=("$process_cmd ($actual_count/1)")
    fi
done

# 输出结果
if [[ ${#array_error[@]} -gt 0 ]]; then
    echo "${array_error[@]}"
else
    echo 0
fi

6. 2.197两个进程

1. 创建包装脚本

1.1 req-zmq 的包装脚本(单进程版本)

sudo tee /usr/local/bin/req-zmq-wrapper.sh > /dev/null << 'EOF'
#!/bin/bash
PREFIX="/home/system/service/boyi_req_zmq_relay"
LOG_DIR="$PREFIX/logs"
DATE=$(date +%Y%m%d)
LOG_FILE="$LOG_DIR/zmq_relay_$DATE.log"

mkdir -p "$LOG_DIR"
cd "$PREFIX"
exec /home/anaconda3/bin/python "$PREFIX/zmq_relay.py" >> "$LOG_FILE" 2>&1
EOF
sudo chmod +x /usr/local/bin/req-zmq-wrapper.sh

1.2 resp-zmq 的包装脚本

sudo tee /usr/local/bin/resp-zmq-wrapper.sh > /dev/null << 'EOF'
#!/bin/bash
PREFIX="/home/system/service/boyi_resp_zmq_relay"
LOG_DIR="$PREFIX/logs"
DATE=$(date +%Y%m%d)
LOG_FILE="$LOG_DIR/zmq_relay_$DATE.log"

mkdir -p "$LOG_DIR"
cd "$PREFIX"
exec /home/anaconda3/bin/python "$PREFIX/zmq_relay.py" >> "$LOG_FILE" 2>&1
EOF
sudo chmod +x /usr/local/bin/resp-zmq-wrapper.sh

2. 创建 systemd 服务文件

2.1 req-zmq.service

sudo tee /etc/systemd/system/req-zmq.service > /dev/null << 'EOF'
[Unit]
Description=BoYi ZMQ Relay Service (Requester)
After=network.target
Wants=network.target

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/home/system/service/boyi_req_zmq_relay
Environment=PYTHONPATH=/home/system/service/boyi_req_zmq_relay

# 使用包装脚本启动
ExecStart=/usr/local/bin/req-zmq-wrapper.sh

# 进程监控和重启配置
Restart=always
RestartSec=10
StartLimitInterval=0
StartLimitBurst=5

# 资源限制(可选)
MemoryLimit=512M
CPUQuota=100%

# 信号处理
KillMode=process
KillSignal=SIGTERM
TimeoutStopSec=30
SendSIGKILL=yes

# 日志配置 - 不输出到journal只输出到文件
StandardOutput=null
StandardError=null
SyslogIdentifier=req-zmq

[Install]
WantedBy=multi-user.target
EOF

2.2 resp-zmq.service

sudo tee /etc/systemd/system/resp-zmq.service > /dev/null << 'EOF'
[Unit]
Description=BoYi ZMQ Relay Service (Responder)
After=network.target
Wants=network.target

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/home/system/service/boyi_resp_zmq_relay
Environment=PYTHONPATH=/home/system/service/boyi_resp_zmq_relay

# 使用包装脚本启动
ExecStart=/usr/local/bin/resp-zmq-wrapper.sh

# 进程监控和重启配置
Restart=always
RestartSec=10
StartLimitInterval=0
StartLimitBurst=5

# 资源限制(可选)
MemoryLimit=512M
CPUQuota=100%

# 信号处理
KillMode=process
KillSignal=SIGTERM
TimeoutStopSec=30
SendSIGKILL=yes

# 日志配置 - 不输出到journal只输出到文件
StandardOutput=null
StandardError=null
SyslogIdentifier=resp-zmq

[Install]
WantedBy=multi-user.target
EOF

3. 创建日志轮转配置

sudo tee /etc/logrotate.d/zmq-services-dated > /dev/null << 'EOF'
/home/system/service/boyi_req_zmq_relay/logs/zmq_relay_*.log
/home/system/service/boyi_resp_zmq_relay/logs/zmq_relay_*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 644 root root
    dateext
    dateformat .%Y%m%d
    sharedscripts
    postrotate
        # 重新加载服务以使用新的日志文件
        systemctl kill -s HUP req-zmq.service >/dev/null 2>&1 || true
        systemctl kill -s HUP resp-zmq.service >/dev/null 2>&1 || true
    endscript
}
EOF

4. 部署和测试

# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 停止旧进程(使用原来的脚本)
cd /home/system/service/boyi_req_zmq_relay
./zmq_relay.sh stop

cd /home/system/service/boyi_resp_zmq_relay
./zmq_relay.sh stop

# 启动 systemd 服务
sudo systemctl start req-zmq
sudo systemctl start resp-zmq

# 查看服务状态
sudo systemctl status req-zmq resp-zmq

# 设置开机自启动
sudo systemctl enable req-zmq resp-zmq

日志路径:

  • /home/system/service/boyi_req_zmq_relay/logs/zmq_relay_YYYYMMDD.log
  • /home/system/service/boyi_resp_zmq_relay/logs/zmq_relay_YYYYMMDD.log