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

530 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 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`