docs(blog): 按博客风格整理三篇技术文档
This commit is contained in:
104
src/programming/backend/c++/01-远程-cpp-项目一键全量构建.md
Normal file
104
src/programming/backend/c++/01-远程-cpp-项目一键全量构建.md
Normal file
@@ -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`,把重复手工操作改成一条可复用命令。
|
||||
|
||||
<!-- more -->
|
||||
|
||||
# 远程 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` 即可降低沟通与操作成本。
|
||||
118
src/programming/linux/基础/05-vnc-单脚本管理与批量下发.md
Normal file
118
src/programming/linux/基础/05-vnc-单脚本管理与批量下发.md
Normal file
@@ -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 机器。
|
||||
|
||||
<!-- more -->
|
||||
|
||||
# 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/<user>/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 <user>@<ip>`
|
||||
|
||||
## 7. 小结
|
||||
|
||||
该方案把 VNC 运维拆成两个可复用脚本:
|
||||
|
||||
- 单机统一管理生命周期
|
||||
- 多机统一批量下发
|
||||
|
||||
适合内网多台 Linux 机器的日常维护与快速复制部署。
|
||||
113
src/work/project-summary/algosimulation-打包与交付记录.md
Normal file
113
src/work/project-summary/algosimulation-打包与交付记录.md
Normal file
@@ -0,0 +1,113 @@
|
||||
---
|
||||
title: AlgoSimulation 打包与交付记录
|
||||
icon: mdi:package-variant-closed
|
||||
date: 2026-03-09
|
||||
category:
|
||||
- 工作
|
||||
- 项目总结
|
||||
tag:
|
||||
- AlgoSimulation
|
||||
- C++
|
||||
- Linux
|
||||
- 打包部署
|
||||
---
|
||||
|
||||
本文记录 AlgoSimulation 在目标机器上的编译、依赖修正与独立目录打包过程,重点是 OpenSSL 符号版本冲突的定位与处理。
|
||||
|
||||
<!-- more -->
|
||||
|
||||
# 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` 精准补齐,避免全量同步带来的不可控差异。
|
||||
Reference in New Issue
Block a user