我正在尝试从 bash 脚本中分叉交互式 bash,如下所示:
#!/bin/bash
bash -c 'bash -i -l' &
运行上述脚本进程 'bash -i -l' 后,CPU 使用率达到 100%。这种行为的原因是什么?
我正在 Fedora 16 上进行测试。
谢谢。
有趣的问题。请注意,这相当于运行:
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。我不知道这样旋转是否正确。