2013-02-17 42 views
1

我試圖從叉bash腳本交互的bash這樣互動的bash:分叉從bash腳本

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

上面的腳本程序運行後 '的bash -i -l' 達到100%的CPU使用率。 這種行爲的原因是什麼?

我正在測試這個在Fedora 16上。

謝謝。

+0

我不知道,但'bash -c'部分的目的是什麼? – 2013-02-17 13:55:50

回答

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。不管正確的行爲如何旋轉,我都不知道。

+0

謝謝你的反饋,這是很好的領導。 – user855433 2013-02-17 15:19:07

+0

謝謝您的反饋,它是良好的領導。我試圖跟蹤的原始問題如下:在一個Java線程exec「bash -c'bash -i -l'2> 1」中,它工作正常。如果我在第一個運行時在第二個java線程中執行相同的exec,則CPU負載很高,而第二個bash沒有響應。我將介紹日誌記錄,目的是查看它是否與上述情況相同。再次感謝。 – user855433 2013-02-17 15:29:33