少なくともGNU bashバージョン4.3.42 x86_64 && GNU bashバージョン4.3.11 x86_64で発生します
シグナルによって割り込み可能にするために(SIGUSR1として)sleep & wait $!
単純な代わりに使用します。ただし、次のコマンドを実行すると、bashビルトインが奇妙な動作をするようです。sleep
sleep
wait
ターミナル1:
cat <(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)&
ターミナル2:
kill -10 /the pid of the subshell, printed by the previous command/
ターミナル1:
^C (ctrl + C)
次に、CPUを100%燃焼させるサブシェルを取得します。
ターミナル1:
pkill -P $(pgrep -P $$)
この現象が発生する理由について何かご存知ですか?
注:cat <(/subshell/)
がバックグラウンドにない場合、問題は発生しません。
この動作を体験する別の方法
ターミナル1:
(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)&
ターミナル2:
kill -10 /the pid of the subshell, printed by the previous command/
ターミナル1:
fg
^C (ctrl + C)
次に、冷凍シェルを入手します。
この動作を体験する3番目の方法
ターミナル1:
(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)
ターミナル2:
kill -10 /the pid of the subshell, printed by the previous command/
ターミナル1:
^C (ctrl + C)
次に、冷凍シェルを入手します。
これをデバッグするには、おそらくソースからBashを構築し、どこでループしているのか(デバッガーでブレークするか、printステートメントを追加する)とループする理由を見つける必要があります。
—
カズ
奇妙な?ここではこれを再現できません。bash4.3.42(1)-release(x86_64-pc-linux-gnu)を使用しています。Debian 8.カーネル4.6.1-1。私はあなたが言うすべてのテストを行いますが、CPUはまだ正常に動作しています...私はあなたが言うように、fg、そしてCTRL + Cを含めて正確にやっています。
—
ルチアーノアンドレスマティーニ
bash
4.4でビルトインとシグナルに関連するいくつかの変更が行われたことを読んだことを覚えていますが、ここで影響を受ける可能性があります。
Bash 4.4.20は
—
ハーフガー
wait
、これと非常によく似たスピンループの問題を修正します。サブプロセスを永久に生成するループでそれに見舞われました。ただし、4.4.20でシナリオをテストしましたが、それでも問題がありました。興味深いことに、私がビルドしたバージョンにデバッガーをアタッチすると、ループが発生していることがわかりましたが、ブレークアウトする効果もあり、ループは再び「テスト」を出力し始めました。言い換えると、デバッガをアタッチすると、スピンループが停止しました。