设置ctp_md_client作为后台服务开机自启动 : ubuntu@VM-0-11-ubuntu:~$ sudo nano /etc/systemd/system/ctp_md_client.service [Unit] Description=CTP Market Data Client [Service] Type=simple User=ubuntu WorkingDirectory=/home/ubuntu/ctpubuntu ExecStart=/home/ubuntu/ctpubuntu/ctp_md_client Environment="LD_LIBRARY_PATH=/home/ubuntu/ctpubuntu/ctpapi" Restart=always [Install] WantedBy=multi-user.target ubuntu@VM-0-11-ubuntu:~$ sudo systemctl daemon-reload ubuntu@VM-0-11-ubuntu:~$ sudo systemctl start ctp_md_client ubuntu@VM-0-11-ubuntu:~$ sudo systemctl enable ctp_md_client Created symlink /etc/systemd/system/multi-user.target.wants/ctp_md_client.service → /etc/systemd/system/ctp_md_client.service. ubuntu@VM-0-11-ubuntu:~$ service ctp_md_client status ● ctp_md_client.service - CTP Market Data Client Loaded: loaded (/etc/systemd/system/ctp_md_client.service; enabled; preset: enabled) Active: active (running) since Sun 2025-06-08 00:08:31 CST; 40s ago Main PID: 1286810 (ctp_md_client) Tasks: 3 (limit: 1964) Memory: 2.8M (peak: 3.0M) CPU: 850ms CGroup: /system.slice/ctp_md_client.service └─1286810 /home/ubuntu/ctpubuntu/ctp_md_client Jun 08 00:08:31 VM-0-11-ubuntu systemd[1]: Started ctp_md_client.service - CTP Market Data Client. Jun 08 00:08:31 VM-0-11-ubuntu ctp_md_client[1286810]: tcp://180.168.146.187:10212 Jun 08 00:08:31 VM-0-11-ubuntu ctp_md_client[1286810]: CTP行情客户端已启动... ubuntu@VM-0-11-ubuntu:~$ sudo reboot Broadcast message from root@VM-0-11-ubuntu on pts/3 (Sun 2025-06-08 00:09:48 CST): The system will reboot now! ubuntu@VM-0-11-ubuntu:~$ Using username "ubuntu". Authenticating with public key "imported-openssh-key" Welcome to Ubuntu 24.04.2 LTS (GNU/Linux 6.8.0-60-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/pro System information as of Sun Jun 8 12:12:16 AM CST 2025 System load: 0.34 Processes: 126 Usage of /: 43.0% of 49.10GB Users logged in: 0 Memory usage: 14% IPv4 address for eth0: 10.3.0.11 Swap usage: 0% * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s just raised the bar for easy, resilient and secure K8s cluster deployment. https://ubuntu.com/engage/secure-kubernetes-at-the-edge Expanded Security Maintenance for Applications is not enabled. 0 updates can be applied immediately. Enable ESM Apps to receive additional future security updates. See https://ubuntu.com/esm or run: sudo pro status Last login: Sat Jun 7 22:15:31 2025 from 36.6.2.38 ubuntu@VM-0-11-ubuntu:~$ service ctp_md_client status ● ctp_md_client.service - CTP Market Data Client Loaded: loaded (/etc/systemd/system/ctp_md_client.service; enabled; preset: enabled) Active: active (running) since Sun 2025-06-08 00:10:10 CST; 2min 13s ago Main PID: 917 (ctp_md_client) Tasks: 3 (limit: 1960) Memory: 3.9M (peak: 7.6M) CPU: 3.131s CGroup: /system.slice/ctp_md_client.service └─917 /home/ubuntu/ctpubuntu/ctp_md_client Jun 08 00:10:10 VM-0-11-ubuntu systemd[1]: Started ctp_md_client.service - CTP Market Data Client. Jun 08 00:10:10 VM-0-11-ubuntu ctp_md_client[917]: tcp://180.168.146.187:10212 Jun 08 00:10:10 VM-0-11-ubuntu ctp_md_client[917]: CTP行情客户端已启动... ubuntu@VM-0-11-ubuntu:~$ 将 ctp_md_client 设置为系统服务后,原本打印到终端的输出会根据服务配置重定向。以下是完整的解决方案: 一、输出流向说明 输出类型 默认去向 推荐处理方式 标准输出(stdout) 丢失 重定向到日志文件 标准错误(stderr) 丢失 重定向到日志文件 系统日志 不记录(除非主动调用logger) 配置systemd捕获 二、创建Systemd服务文件 创建 /etc/systemd/system/ctp_md.service: ini [Unit] Description=CTP Market Data Client After=network.target [Service] Type=simple User=ctpuser # 建议创建专用用户 WorkingDirectory=/path/to/ctp ExecStart=/path/to/ctp_md_client -c /etc/ctp/config.ini # 日志重定向配置 StandardOutput=file:/var/log/ctp/md.log StandardError=file:/var/log/ctp/md_error.log # 或使用journald: # StandardOutput=journal # StandardError=journal # 自动重启配置 Restart=always RestartSec=30 [Install] WantedBy=multi-user.target 三、关键配置详解 1. 日志文件管理 bash # 创建日志目录 sudo mkdir -p /var/log/ctp sudo chown ctpuser:ctpuser /var/log/ctp # 日志轮转配置 (/etc/logrotate.d/ctp) /var/log/ctp/*.log { daily rotate 7 missingok notifempty compress delaycompress create 0640 ctpuser ctpuser } 2. 环境变量传递 ini [Service] Environment="LD_LIBRARY_PATH=/path/to/ctpapi" Environment="CTP_LOG_LEVEL=debug" 3. 资源限制 ini [Service] LimitNOFILE=65535 LimitMEMLOCK=infinity 四、服务管理命令 bash # 重载服务配置 sudo systemctl daemon-reload # 启用开机启动 sudo systemctl enable ctp_md # 启动服务 sudo systemctl start ctp_md # 查看状态 sudo systemctl status ctp_md # 查看日志(如果使用journald) journalctl -u ctp_md -f 五、日志查看方式 1. 直接查看日志文件 bash tail -f /var/log/ctp/md.log tail -f /var/log/ctp/md_error.log 2. 通过journald查看 bash # 实时查看 journalctl -u ctp_md -f # 按时间筛选 journalctl -u ctp_md --since "2023-06-01" --until "2023-06-02" # 导出完整日志 journalctl -u ctp_md > ctp_md_full.log 六、高级调试技巧 1. 临时输出到控制台 ini [Service] StandardOutput=tty StandardError=tty TTYPath=/dev/console # 需要配合以下命令 sudo systemctl enable getty@tty1.service 2. 多日志分流 bash ExecStart=/bin/sh -c '/path/to/ctp_md_client 2>&1 | tee -a /var/log/ctp/full.log | logger -t ctp_md' 3. 核心转储配置 bash # 在服务文件中添加 LimitCORE=infinity # 然后执行 sudo sysctl -w kernel.core_pattern=/var/coredumps/core-%e-%p-%t 七、常见问题处理 1. 无日志输出 检查项: bash # 确认服务用户有写权限 sudo -u ctpuser touch /var/log/ctp/test.log # 检查SELinux sudo ausearch -m avc -ts recent | grep ctp 2. 日志文件过大 解决方案: ini [Service] StandardOutput=syslog StandardError=syslog SyslogIdentifier=ctp_md 3. 服务启动失败 调试命令: bash sudo systemctl status ctp_md -l sudo journalctl -xe 八、生产环境建议 结构化日志 cpp // 在代码中使用JSON格式日志 void OnRtnDepthMarketData(...) { std::cout << R"({"time":")" << GetCurrentTime() << R"(","instrument":")" << pDepthMarketData->InstrumentID << R"("})" << std::endl; } 监控集成 bash # Prometheus监控示例 echo 'ctp_status{service="md"} 1' | curl --data-binary @- http://monitor:9091/metrics/job/ctp 报警配置 bash # 检测服务挂掉 sudo apt install monit # /etc/monit/conf.d/ctp check process ctp_md with pidfile /run/ctp_md.pid start program = "/bin/systemctl start ctp_md" stop program = "/bin/systemctl stop ctp_md" if not exist then alert