我正在尝试从bash脚本中分叉交互式bash,如下所示:
#!/bin/bash
bash -c 'bash -i -l' &
运行上面的脚本进程后'bash -i -l'达到100%的CPU使用率。 这种行为的原因是什么?
我在Fedora 16上测试它。
感谢。
答案 0 :(得分:2)
有趣的问题。请注意,这相当于运行:
bash -c "bash -c 'bash -i -l' &"
在命令提示符下。我得到了相同的结果:
bash -c "bash -i &"
非常确定发生了什么是Bash正在轮询试图访问控制终端(因为它试图进行交互),但不允许(因为它是后台进程)。我试过运行bash -c 'strace -o bash_trace.txt bash -i &'
。它在循环中这样做:
...
rt_sigaction(SIGTTIN, {SIG_DFL, [], 0}, {SIG_IGN, [], 0}, 8) = 0
kill(0, SIGTTIN) = 0
--- SIGTTIN (Stopped (tty input)) @ 0 (0) ---
rt_sigaction(SIGTTIN, {SIG_IGN, [], 0}, {SIG_DFL, [], 0}, 8) = 0
ioctl(255, TIOCGPGRP, [9964]) = 0
rt_sigaction(SIGTTIN, {SIG_DFL, [], 0}, {SIG_IGN, [], 0}, 8) = 0
kill(0, SIGTTIN) = 0
--- SIGTTIN (Stopped (tty input)) @ 0 (0) ---
rt_sigaction(SIGTTIN, {SIG_IGN, [], 0}, {SIG_DFL, [], 0}, 8) = 0
ioctl(255, TIOCGPGRP, [9964]) = 0
rt_sigaction(SIGTTIN, {SIG_DFL, [], 0}, {SIG_IGN, [], 0}, 8) = 0
kill(0, SIGTTIN) = 0
--- SIGTTIN (Stopped (tty input)) @ 0 (0) ---
...
进程在尝试访问控制终端时获得SIGTTIN,但它们是背景的 - http://www.lindevdoc.org/wiki/SIGTTIN。是不是正确的行为就像这样,我不知道。