编译程序死机通常是文件锁阻塞、资源争抢或I/O卡在远程路径所致,表现为光标静止、CPU占用低、磁盘灯狂闪且无报错;应优先用strace定位flock/renameat2/openat阻塞点,再kill相关进程、清除build.ninja.lock等残留锁文件,并将build目录移至本地磁盘规避。

电脑运行编译程序时死机,通常不是系统整体崩溃,而是编译进程被文件锁阻塞、资源争抢或I/O卡在远程挂载路径上,表现为光标静止、CPU占用低、磁盘灯狂闪且无报错输出。
先确认是不是文件锁在阻塞
打开终端,执行 strace -p $(pgrep -f 'gcc|clang|make|ninja'),若输出卡在 flock()、renameat2() 或 openat(..., O_CREAT|O_EXCL) 系统调用上,说明是文件锁机制导致的假死——此时强制重启会丢失构建状态,应优先释放锁而非断电。
若 strace 无响应或找不到对应进程,再执行 lsof +D /path/to/build 查看 build 目录下被哪些进程锁定文件;特别注意残留的 build.ninja.lock 或 .ninja_log 文件,它们可能因上次崩溃未释放。
立刻释放阻塞锁并清空残留状态
第一步:杀掉所有疑似编译相关进程:killall -9 gcc clang make ninja python3(注意不要用 sudo killall -9,避免误杀系统进程)。
第二步:进入构建目录,删除锁文件和临时状态:rm -f build.ninja.lock .ninja_log .ninja_deps。
第三步:检查是否还有进程持有该目录句柄:lsof +D ./build 2>/dev/null | grep -v "PID"。如果有输出,记下 PID,执行 kill -9 PID;若提示“Permission denied”,说明是 root 进程持有,需切到 root 执行 sudo lsof +D ./build 再处理。
【必须先清锁再重编译,否则 Ninja/GCC 会持续等待旧锁释放】
永久规避:把 build 目录移到本地磁盘
方法一:直接改构建路径
不修改 CMakeLists.txt,只在命令行指定本地路径:cmake -B /home/username/build-local -S .,后续所有 cmake --build 都走这个本地目录。
方法二:重挂载 Samba 共享(仅限必须用共享场景)
卸载原挂载点:sudo umount /mnt/proj;
用严格缓存参数重新挂载:sudo mount -t cifs //192.168.1.100/project /mnt/proj -o credentials=/etc/samba/cred,iocharset=utf8,cache=strict,noperm,uid=1000,gid=1000,vers=3.0。
方法三:禁用编辑器原子保存(针对 Sublime/PhpStorm/VSCodium)
Sublime Text:设置中搜索 atomic_save → 设为 false;
VS Code:设置里搜 files.atomicSave → 改成 off;
PhpStorm:Settings → Appearance & Behavior → System Settings → 勾掉 Use "safe write"。
注意:Windows 共享若服务端未启用 posix extensions = yes,即使客户端参数全对,rename 操作仍不可靠——这种情况下,【本地编译 + rsync 同步】是唯一稳定方案】。
验证是否解决
执行 make -j4 clean && make -j4,观察是否全程无停顿;若仍有卡顿,立即中断并检查 /proc/sys/fs/inotify/max_user_watches 是否过低(低于 524288 会导致 Ninja 监控失效),临时提升:echo 524288 | sudo tee /proc/sys/fs/inotify/max_user_watches。

















