私は次のようなbashスクリプトからインタラクティブなbashをフォークしようとしています:
#!/bin/bash
bash -c 'bash -i -l' &
上記のスクリプトプロセスを実行した後、「bash -i -l」は100%のCPU使用率に達します。そのような行動の理由は何ですか?
私はこれをFedora16でテストしています。
ありがとう。
興味深い質問です。これは実行と同等であることに注意してください。
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。このように回転する正しい動作かどうかはわかりません。