使用make --output-sync重定向到/dev/null时挂起的问题求助
解决方案
问题根源
--output-sync(尤其是recurse模式)在重定向输出到非终端设备(比如/dev/null)时,容易触发GNU Make的进程同步死锁bug——该选项依赖终端的缓冲机制协调子进程输出,重定向后缓冲逻辑异常,导致make与子进程互相等待,甚至无法响应信号。
可行解决办法
换用更轻量的同步模式
放弃recurse,改用--output-sync=target模式,它按编译目标同步输出,逻辑更简单,死锁概率极低:make -j8 --output-sync=target > /dev/null关闭输出同步(最直接)
如果不需要统一子进程输出的顺序,直接关掉--output-sync,常规重定向即可:# 仅抑制标准输出,保留错误输出 make -j8 > /dev/null # 同时抑制标准输出和错误输出 make -j8 > /dev/null 2>&1用script模拟终端环境
script命令可以模拟终端会话,让make保持终端环境下的缓冲行为,绕开重定向导致的死锁:script -q /dev/null make -j8 --output-sync=recurse > /dev/null-q参数用来抑制script本身的输出提示。升级GNU Make版本
这类死锁bug在GNU Make 4.2及更早版本中比较常见,升级到4.3或更高的稳定版,官方已修复不少同步输出相关的死锁问题。
内容的提问来源于stack exchange,提问作者LeonFibuck
相关产品推荐
相关产品推荐

