从bash脚本分叉交互式bash

时间:2013-02-17 13:00:30

标签: bash fork

我正在尝试从bash脚本中分叉交互式bash,如下所示:

#!/bin/bash
bash -c 'bash -i -l' &

运行上面的脚本进程后'bash -i -l'达到100%的CPU使用率。 这种行为的原因是什么?

我在Fedora 16上测试它。

感谢。

1 个答案:

答案 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。是不是正确的行为就像这样,我不知道。