1

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

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

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

我正在 Fedora 16 上进行测试。

谢谢。

4

1 回答 1

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。我不知道这样旋转是否正确。

于 2013-02-17T14:03:27.567 回答