## 1. 创建包装脚本 ### 1.1 req-zmq-config1 的包装脚本 ```bash 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 的包装脚本 ```bash 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 的包装脚本 ```bash 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 的包装脚本 ```bash 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 ```bash 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 ```bash 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 ```bash 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 ```bash 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. 创建日志轮转配置 ```bash 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. 部署和测试 ```bash # 重新加载 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 ```bash #!/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 的包装脚本(单进程版本) ```bash 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 的包装脚本 ```bash 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 ```bash 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 ```bash 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. 创建日志轮转配置 ```bash 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. 部署和测试 ```bash # 重新加载 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`