Tritt mindestens auf GNU bash Version 4.3.42 x86_64 && GNU Bash - Version 4.3.11 x86_64
Ich benutze sleep & wait $!
statt eines einfachen sleep
um eine Unterbrechung sleep
durch ein Signal zu bekommen (als SIGUSR1 ). Aber es wait
sieht so aus, als würde sich die Bash-Funktion auf seltsame Weise verhalten, wenn Sie Folgendes ausführen.
Terminal 1:
cat <(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)&
Terminal 2:
kill -10 /the pid of the subshell, printed by the previous command/
Terminal 1:
^C (ctrl + C)
Dann bekomme ich die Subshell, die eine CPU zu 100 Prozent brennt.
Terminal 1:
pkill -P $(pgrep -P $$)
Haben Sie eine Vorstellung davon, warum dieses Verhalten auftritt?
NB : Es tritt kein Problem auf, wenn sich das cat <(/subshell/)
nicht im Hintergrund befindet.
Ein anderer Weg, um dieses Verhalten zu erleben
Terminal 1:
(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)&
Terminal 2:
kill -10 /the pid of the subshell, printed by the previous command/
Terminal 1:
fg
^C (ctrl + C)
Dann holen Sie sich eine gefrorene Schale.
Ein dritter Weg, um dieses Verhalten zu erleben
Terminal 1:
(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)
Terminal 2:
kill -10 /the pid of the subshell, printed by the previous command/
Terminal 1:
^C (ctrl + C)
Dann holen Sie sich eine gefrorene Schale.
bash
4.4 geändert haben. Vielleicht könnte dies hier betroffen sein.
wait
, das dem sehr ähnlich sieht. Das traf mich in einer Schleife, die für immer Unterprozesse hervorbrachte. Ich habe Ihr Szenario jedoch auf 4.4.20 getestet und es war immer noch ein Problem. Interessanterweise , wenn ich einen Debugger an einer Version angebracht ich gebaut, konnte ich sehen , es wurde Umschlingung, aber es auch hatte die Wirkung , brechen aus ihm heraus, und die Schleife beginnen würde wieder ausgibt ‚test‘. Mit anderen Worten: Durch das Anhängen des Debuggers wurde das Schleifen beendet.