前言
distcc
是一个用于分布式编译的工具,它可以将编译任务分发到多台计算机上,从而加快代码编译的速度。distcc
允许多台计算机共同参与编译过程,利用分布式系统的优势来并行处理编译任务,从而提高编译速度和性能。
在传统的编译过程中,代码被发送到一台计算机上,然后由该计算机上的编译器进行编译。这种方式在大型项目中可能会消耗大量时间,特别是当项目变得复杂并且代码量增加时,编译时间会显著增加。
distcc
解决了这个问题,它通过在局域网内或远程服务器上设置 distcc
客户端和 distccd
服务器来实现分布式编译。distcc
客户端将编译任务发送到 distccd
服务器,而服务器上的 distccd
守护进程将任务分发给多个可用的编译器进行并行编译。一旦编译完成,编译结果将发送回到 distcc
客户端,然后再进行链接等后续处理。
通过 distcc
的使用,编译过程可以更快地完成,节省了开发人员的时间,并且利用了局域网或网络上的多台计算机的计算资源,提高了编译效率。
distcc支持多种编程语言,包括C,C ++,Objective-C和Fortran。它是一个开源软件,可以在Linux,Unix和Windows等平台上运行。
问题
前面主要简单的叙述了什么是distcc
,我遇到的问题就是前几天用的好好的distcc
,最近总是报出以下错误:
distcc[18595] (dcc_pump_sendfile) ERROR: sendfile failed: Broken pipe
distcc[18595] (dcc_readx) ERROR: unexpected eof on fd6
distcc[18595] (dcc_r_token_int) ERROR: read failed while waiting for token “DONE”
distcc[18595] (dcc_r_result_header) ERROR: server provided no answer. Is the server configured to allow access from your IP address? Is the server performing authentication and your client isn’t? Does the server have the compiler installed? Is the server configured to access the compiler?
distcc[18595] Warning: failed to distribute /home/demo/workspace/x_server/gameserver/battle/effect/addbuffroundeffectexecutormodule.cpp to 10.12.7.181, running locally instead
先是Google一番没找到解决方案,又去问了ChatGPT,给出的答案偏向于权限问题,这就很奇怪,我之前用的好好的,为啥突然会出现权限问题,他可能是错误描述的影响:
ERROR: server provided no answer. Is the server configured to allow access from your IP address? Is the server performing authentication and your client isn’t? Does the server have the compiler installed? Is the server configured to access the compiler?
解决方案
一开始我也是朝着配置和权限来努力的,可是怎样重启服务或是修改配置都不好使,查了防火墙也没问题,telnet 3262端口也是通的,最终我把目光定位到了sendfile failed: Broken pipe
这句话,不会是磁盘满了吧?df
一查还真是,唉,折腾了好久~
-exec command ; 和-exec command {} +区别
这篇内容有点少,补充一个我今天刚学到的知识点吧~
在 find
命令中,-exec command ;
和 -exec command {} +
是两种不同的方式来执行指定的命令。
-exec command ;
这种方式将对 find
命令找到的每个文件依次执行一次指定的命令。每找到一个匹配的文件,都会执行一次该命令。例如:
1 | find /path/to/search -type f -name "*.txt" -exec echo {} \; |
上述命令会在 /path/to/search
目录及其子目录中搜索所有扩展名为 .txt
的文件,并依次输出每个文件的名称。
-exec command {} +
这种方式也会执行指定的命令,但是它会将多个找到的文件一起传递给命令进行一次执行。这种方式通常比使用 ;
更高效,因为它可以将多个文件组合在一起,减少了命令的调用次数。例如:
1 | find /path/to/search -type f -name "*.txt" -exec cat {} + |
上述命令会在 /path/to/search
目录及其子目录中搜索所有扩展名为 .txt
的文件,并将它们一起传递给 cat
命令进行合并输出。
如果只需要针对每个文件执行一次命令,可以使用 -exec command ;
。如果想要将多个文件组合在一起一次性执行命令,可以使用 -exec command {} +
。选择哪种方式取决于具体的需求和效率考虑。
总结
- 当
distcc
突然不好使并提示sendfile failed: Broken pipe
的时候去看看服务器磁盘是不是满了 - 使用
-exec command ;
将对每个匹配的文件分别执行一次命令。 - 使用
-exec command {} +
将多个匹配的文件一起传递给命令执行。
今朝有今朝醉不是一种豁达,或许是一种无可奈何吧~
2023-7-21 22:31:00