En azından GNU bash sürüm 4.3.42 x86_64 && GNU bash sürüm 4.3.11 x86_64 üzerinde oluşur
Ben bir sinyal ( SIGUSR1 olarak ) tarafından bir kesinti almak için sleep & wait $!
basit yerine kullanın . Ama öyle görünüyor ki, bash-builtin, aşağıdakileri çalıştırdığınızda garip bir şekilde davranıyor.sleep
sleep
wait
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)
Sonra, bir CPU'yu yüzde 100 oranında yakan alt kabuğu alıyorum.
Terminal 1:
pkill -P $(pgrep -P $$)
Bu davranışın neden oluştuğu hakkında bir fikriniz var mı?
Not : cat <(/subshell/)
Arka planda değilken sorun oluşmaz .
Bu davranışı deneyimlemenin başka bir yolu
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)
Sonra donmuş bir kabuk alın.
Bu davranışı deneyimlemenin üçüncü yolu
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)
Sonra donmuş bir kabuk alın.
bash
4.4'te yerleşik ve sinyallerle ilgili bazı şeylerin değiştiğini okuduğumu hatırlıyorum , belki de burada etkilenebilir.
wait
, buna çok benzeyen bir spinloop sorununu giderir . Sonsuza kadar alt süreçleri ortaya çıkaran bir döngüde bana çarptı. Ancak, senaryoyu 4.4.20'de test ettim ve bu hala bir problemdi. İlginç bir şekilde, oluşturduğum bir sürüme bir hata ayıklayıcı eklediğimde, bunun etrafında döngü olduğunu görebiliyordum, ancak bunun da kırılma etkisi vardı ve döngü tekrar 'test' çıktısı vermeye başlayacaktı. Başka bir deyişle: hata ayıklayıcıyı bağlamak eğrilmeyi durdurdu.