偶尔GNU Make会挂起,永远。该环境是一个64逻辑核心x86-64 Ubuntu 16.04 Linux 4.4机器。 (它也发生在以前的Linux版本中。)
makefile正在使用-j65 -l69
。没有规则使用+
jobserver继承。
MAKEFLAGS += -j$(shell expr $$(nproc) + 1) -l$(shell expr $$(nproc) + 5)
这个过程是
$ ps aux | grep make
myuser 100694 0.0 0.0 86268 80016 ? S 15:14 0:28 make
此过程在将"+"
写入管道时挂起。
$ strace -s 99 -ffp 100694
strace: Process 100694 attached
write(4, "+", 1
$ sudo cat /proc/100694/stack
[<ffffffff81216080>] pipe_wait+0x70/0xc0
[<ffffffff81216207>] pipe_write+0xc7/0x420
[<ffffffff8120d0bb>] new_sync_write+0x9b/0xe0
[<ffffffff8120d126>] __vfs_write+0x26/0x40
[<ffffffff8120daa9>] vfs_write+0xa9/0x1a0
[<ffffffff8120e765>] SyS_write+0x55/0xc0
[<ffffffff81816d72>] entry_SYSCALL_64_fastpath+0x16/0x71
[<ffffffffffffffff>] 0xffffffffffffffff
我认为这种行为是GNU Make的jobserver,表明有可用容量。
正如预期的那样,该过程可以打开读写管道。
$ ls /proc/100694/fd
0 1 10 11 12 13 14 15 2 3 4 6 7 8 9
$ stat /proc/100694/fd/4
File: '/proc/100694/fd/4' -> 'pipe:[1617033]'
$ lsof | grep 1617033
make 100694 myuser 3r FIFO 0,10 0t0 1617033 pipe
make 100694 myuser 4w FIFO 0,10 0t0 1617033 pipe