From e765565a70923741818c1c19b846e11c06a39401 Mon Sep 17 00:00:00 2001 From: liumangmang Date: Mon, 9 Mar 2026 14:09:19 +0800 Subject: [PATCH] =?UTF-8?q?docs(blog):=20=E6=8C=89=E5=8D=9A=E5=AE=A2?= =?UTF-8?q?=E9=A3=8E=E6=A0=BC=E6=95=B4=E7=90=86=E4=B8=89=E7=AF=87=E6=8A=80?= =?UTF-8?q?=E6=9C=AF=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../c++/01-远程-cpp-项目一键全量构建.md | 104 +++++++++++++++ .../linux/基础/05-vnc-单脚本管理与批量下发.md | 118 ++++++++++++++++++ .../algosimulation-打包与交付记录.md | 113 +++++++++++++++++ 3 files changed, 335 insertions(+) create mode 100644 src/programming/backend/c++/01-远程-cpp-项目一键全量构建.md create mode 100644 src/programming/linux/基础/05-vnc-单脚本管理与批量下发.md create mode 100644 src/work/project-summary/algosimulation-打包与交付记录.md diff --git a/src/programming/backend/c++/01-远程-cpp-项目一键全量构建.md b/src/programming/backend/c++/01-远程-cpp-项目一键全量构建.md new file mode 100644 index 0000000..9697d90 --- /dev/null +++ b/src/programming/backend/c++/01-远程-cpp-项目一键全量构建.md @@ -0,0 +1,104 @@ +--- +title: 远程 C++ 项目一键全量构建 +icon: mdi:language-cpp +date: 2026-03-09 +category: + - C++ + - 后端 + - Linux +tag: + - C++ + - 编译 + - Makefile + - SSH +--- + +这篇文章整理一次远程 C++ 项目编译流程:从 SSH 连接、路径核对,到将全量构建固化为 `build.sh`,把重复手工操作改成一条可复用命令。 + + + +# 远程 C++ 项目一键全量构建 + +## 1. 场景信息 + +- 目标主机:`10.6.223.0` +- 项目根目录:`/home/sunri/PRS-7950/V1.00_2024` +- C++ 源码目录:`/home/sunri/PRS-7950/V1.00_2024/src_cxx` + +## 2. 先确认连接与路径 + +先验证 SSH 连通性: + +```bash +ssh 10.6.223.0 +``` + +连接后可用 `hostname` 确认机器身份。 + +这次排查中,一个关键点是目录名确认: + +- 错误路径:`/home/sunri/PRS-7950/V1.00_2024/src_cx` +- 正确路径:`/home/sunri/PRS-7950/V1.00_2024/src_cxx` + +编译前先核对路径,通常比盲目调整编译参数更有效。 + +## 3. 执行增量编译 + +在源码目录执行: + +```bash +make -j"$(nproc)" +``` + +说明: + +- `-j"$(nproc)"` 表示按 CPU 核心数并行编译 +- 若出现 `Nothing to be done for 'first'`,通常表示该目标已是最新状态(增量构建正常现象) + +## 4. 固化为一键全量构建脚本 + +在 `src_cxx` 下创建 `build.sh`: + +```bash +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +cd "$SCRIPT_DIR" + +echo "[build] Cleaning project..." +make clean + +echo "[build] Building project (full rebuild)..." +make -j"$(nproc)" + +echo "[build] Done." +``` + +赋予执行权限: + +```bash +chmod +x build.sh +``` + +## 5. 日常使用方式 + +```bash +cd /home/sunri/PRS-7950/V1.00_2024/src_cxx +./build.sh +``` + +脚本固定执行两步: + +1. `make clean` +2. `make -j"$(nproc)"` + +## 6. 小结 + +这套流程的核心不是命令复杂度,而是标准化: + +- 先确认路径和环境 +- 再把全量构建流程脚本化 + +后续交付或排障时,只需要统一执行 `./build.sh` 即可降低沟通与操作成本。 diff --git a/src/programming/linux/基础/05-vnc-单脚本管理与批量下发.md b/src/programming/linux/基础/05-vnc-单脚本管理与批量下发.md new file mode 100644 index 0000000..32dc660 --- /dev/null +++ b/src/programming/linux/基础/05-vnc-单脚本管理与批量下发.md @@ -0,0 +1,118 @@ +--- +title: VNC 单脚本管理与批量下发 +icon: mdi:remote-desktop +date: 2026-03-09 +category: + - Linux +tag: + - VNC + - 运维 + - Bash + - SSH +--- + +本文记录一次 VNC 运维落地方案:在单机用 `vnc_ctl.sh` 统一管理服务生命周期,再通过 `deploy_to_desktop.sh` 按 IP 列表批量下发到多台 Linux 机器。 + + + +# VNC 单脚本管理与批量下发 + +## 1. 目标场景 + +示例目标机器: + +- `10.6.223.223` +- `10.6.220.165` +- `10.6.221.8` +- `10.6.223.233` + +统一目标: + +1. 在远程桌面生成 `vnc_ctl.sh` +2. 后台运行 `x0vncserver` +3. 提供开机自启能力 +4. 支持状态检查与一键停止 +5. 支持批量下发,减少重复操作 + +## 2. 管理脚本设计 + +主脚本:`vnc_ctl.sh` + +支持命令: + +- `start`:启动 VNC +- `stop`:停止 VNC +- `check`:检查进程、端口、密码文件与日志 +- `restart`:重启服务 +- `install-autostart`:安装 `@reboot` 自启 +- `remove-autostart`:移除自启 + +核心思路: + +- 通过 `pgrep` 精确匹配 `x0vncserver` 参数定位进程 +- 使用 `nohup` 后台运行并记录日志 +- 通过 `crontab` 注入 `@reboot` 行实现开机拉起 + +示例(启动命令段): + +```bash +nohup x0vncserver \ + -display ":0" \ + -passwordfile "$HOME/.vnc/passwd" \ + -rfbport "5900" \ + -nevershared \ + -idletimeout 0 \ + >>"$HOME/.vnc/x0vncserver-5900.log" 2>&1 & +``` + +## 3. 批量下发脚本 + +下发脚本:`deploy_to_desktop.sh` + +用途:把本地脚本按 IP 列表分发到远程桌面目录,并自动加执行权限。 + +示例命令: + +```bash +./deploy_to_desktop.sh -f ./vnc_ctl.sh -i 10.6.223.233,10.6.220.165 -u sunri +``` + +脚本默认行为: + +- 目标目录默认为 `/home//Desktop` +- 使用 SSH/SCP 分发 +- 分发后自动执行 `chmod +x` + +## 4. 推荐使用流程 + +```bash +chmod +x ./vnc_ctl.sh ./deploy_to_desktop.sh +./deploy_to_desktop.sh -f ./vnc_ctl.sh -i 10.6.223.233,10.6.220.165 -u sunri +``` + +远程执行示例: + +```bash +ssh sunri@10.6.220.165 "/home/sunri/Desktop/vnc_ctl.sh install-autostart && /home/sunri/Desktop/vnc_ctl.sh start && /home/sunri/Desktop/vnc_ctl.sh check" +``` + +## 5. 测试结论 + +- `10.6.220.165`:下发成功,脚本存在且可执行 +- `10.6.223.233`:下发失败,原因为 SSH 认证失败(`Permission denied`) + +## 6. 常见问题排查 + +- 缺少密码文件:在目标机执行 `vncpasswd` +- 端口未监听:检查 `~/.vnc/x0vncserver-5900.log` +- 开机自启未生效:检查 `crontab -l` 中 `@reboot ... vnc_ctl.sh start ...` +- 无法下发:先手动验证 `ssh @` + +## 7. 小结 + +该方案把 VNC 运维拆成两个可复用脚本: + +- 单机统一管理生命周期 +- 多机统一批量下发 + +适合内网多台 Linux 机器的日常维护与快速复制部署。 diff --git a/src/work/project-summary/algosimulation-打包与交付记录.md b/src/work/project-summary/algosimulation-打包与交付记录.md new file mode 100644 index 0000000..9110099 --- /dev/null +++ b/src/work/project-summary/algosimulation-打包与交付记录.md @@ -0,0 +1,113 @@ +--- +title: AlgoSimulation 打包与交付记录 +icon: mdi:package-variant-closed +date: 2026-03-09 +category: + - 工作 + - 项目总结 +tag: + - AlgoSimulation + - C++ + - Linux + - 打包部署 +--- + +本文记录 AlgoSimulation 在目标机器上的编译、依赖修正与独立目录打包过程,重点是 OpenSSL 符号版本冲突的定位与处理。 + + + +# AlgoSimulation 打包与交付记录 + +## 1. 目标与环境 + +- 编译目标:`/home/sunri/IdeaProjects/V2.00/src_cxx/99_TestTool/AlgoSimulation` +- 编译机:`10.6.221.8` +- 参考机:`10.6.220.186` +- 约束:`08_Preview` 已同步完成,本次仅处理编译、链接与打包 + +## 2. 基础编译流程 + +```bash +export PRJHOME=/home/sunri/IdeaProjects/V2.00 +export CYGHOME=/home/sunri/08_Preview/linx80 +cd /home/sunri/IdeaProjects/V2.00/src_cxx/99_TestTool/AlgoSimulation +qmake AlgoSimulation.pro +make -j4 +``` + +## 3. 链接问题与修正 + +链接阶段出现 OpenSSL 相关符号版本不匹配(`OPENSSL_1_1_0d`)。 + +原因是 `libmosquitto`、`libcurl`、`libssh2` 依赖的 OpenSSL 版本,与系统默认搜索到的 `libssl/libcrypto` 不一致。 + +修正方式:通过 `qmake` 注入链接参数,显式指定 `gmssl` 库并关闭 `as-needed` 提前裁剪。 + +```bash +export PRJHOME=/home/sunri/IdeaProjects/V2.00 +export CYGHOME=/home/sunri/08_Preview/linx80 +cd /home/sunri/IdeaProjects/V2.00/src_cxx/99_TestTool/AlgoSimulation +make clean +qmake "QMAKE_LFLAGS+=-Wl,--no-as-needed" \ + "LIBS+=/usr/local/gmssl/lib/libssl.so.1.1 /usr/local/gmssl/lib/libcrypto.so.1.1" \ + AlgoSimulation.pro +make -j4 +``` + +编译产物:`/home/sunri/IdeaProjects/V2.00/binary/linx80/bin/AlgoSimulation` + +## 4. 独立目录打包 + +目标目录:`/home/sunri/Desktop/AlgoSimulation_tool` + +```bash +TOOL=/home/sunri/Desktop/AlgoSimulation_tool +BIN=/home/sunri/IdeaProjects/V2.00/binary/linx80/bin/AlgoSimulation + +rm -rf "$TOOL" +mkdir -p "$TOOL/bin" "$TOOL/lib" +cp -f "$BIN" "$TOOL/bin/" + +ldd "$BIN" | awk '/=> \/home\/sunri\// {print $3} /=> \/usr\/local\/gmssl\// {print $3}' | sort -u | while read -r so; do + cp -f "$so" "$TOOL/lib/" +done + +cp -f /usr/local/gmssl/lib/libssl.so.1.1 "$TOOL/lib/" +cp -f /usr/local/gmssl/lib/libcrypto.so.1.1 "$TOOL/lib/" +``` + +启动脚本 `run_AlgoSimulation.sh`: + +```bash +#!/usr/bin/env bash +set -e +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +export LD_LIBRARY_PATH="$SCRIPT_DIR/lib:${LD_LIBRARY_PATH:-}" +exec "$SCRIPT_DIR/bin/AlgoSimulation" "$@" +``` + +## 5. 验证结果 + +缺库检查: + +```bash +LD_LIBRARY_PATH=/home/sunri/Desktop/AlgoSimulation_tool/lib \ +ldd /home/sunri/Desktop/AlgoSimulation_tool/bin/AlgoSimulation | grep "not found" +``` + +- 结果:无输出(未发现缺失依赖) + +启动冒烟: + +- 在无图形会话环境下提示 `cannot connect to X server` +- 结论:当前阻塞点是图形环境,不是依赖缺失 + +## 6. 交付清单 + +- `/home/sunri/Desktop/AlgoSimulation_tool/bin/AlgoSimulation` +- `/home/sunri/Desktop/AlgoSimulation_tool/lib/` +- `/home/sunri/Desktop/AlgoSimulation_tool/run_AlgoSimulation.sh` + +## 7. 后续建议 + +若后续仍出现符号版本或缺库问题,优先按缺失项从 `10.6.220.186` 精准补齐,避免全量同步带来的不可控差异。