chờ bash-buildin đốt cháy CPU ở mức 100 phần trăm


15

Xảy ra ít nhất trên phiên bản bash GNU 4.3.42 x86_64 && GNU bash phiên bản 4.3.11 x86_64

Tôi sử dụng sleep & wait $!thay vì đơn giản sleepđể nhận sleeptín hiệu ngắt (như SIGUSR1 ). Nhưng có vẻ như waitbash-buildin hành xử theo một cách kỳ lạ khi bạn chạy như sau.

Nhà ga 1:

cat <(
   trap 'echo SIGUSR1' SIGUSR1;
   echo $BASHPID;
   while :;do
       sleep 1 &
       wait $!;
       echo test;
   done
   )&

Nhà ga 2:

kill -10 /the pid of the subshell, printed by the previous command/

Nhà ga 1:

^C (ctrl + C)

Sau đó, tôi nhận được lớp con đốt cháy CPU ở mức 100 phần trăm.

Nhà ga 1:

pkill -P $(pgrep -P $$)

Bạn có biết tại sao hành vi này xảy ra không?

NB : không có vấn đề xảy ra khi cat <(/subshell/)không có nền.


Một cách khác để trải nghiệm hành vi này

Nhà ga 1:

(
   trap 'echo SIGUSR1' SIGUSR1;
   echo $BASHPID;
   while :;do
       sleep 1 &
       wait $!;
       echo test;
   done
)&

Nhà ga 2:

kill -10 /the pid of the subshell, printed by the previous command/

Nhà ga 1:

fg
^C (ctrl + C)

Sau đó, lấy vỏ đông lạnh.


Cách thứ ba để trải nghiệm hành vi này

Nhà ga 1:

(
   trap 'echo SIGUSR1' SIGUSR1;
   echo $BASHPID;
   while :;do
       sleep 1 &
       wait $!;
       echo test;
   done
)

Nhà ga 2:

kill -10 /the pid of the subshell, printed by the previous command/

Nhà ga 1:

^C (ctrl + C)

Sau đó, lấy vỏ đông lạnh.


Để gỡ lỗi này, có lẽ bạn phải xây dựng Bash từ các nguồn và tìm ra nơi nó đang lặp (phá vỡ nó bằng trình gỡ lỗi hoặc thêm các câu lệnh in) và tại sao nó lại lặp.
Kaz

1
Lạ nhỉ? Tôi không thể sao chép cái này ở đây, tôi đang sử dụng bash 4.3.42 (1) -release (x86_64-pc-linux-gnu). Debian 8. Hạt nhân 4.6.1-1. Tôi thực hiện tất cả các bài kiểm tra mà bạn nói nhưng CPU vẫn chạy bình thường ... Tôi đang làm chính xác như bạn nói bao gồm cả fg, và sau đó là CTRL + C.
Luciano Andress Martini

Tôi nhớ đã đọc rằng một số điều liên quan đến tích hợp và tín hiệu đã thay đổi trong bash4.4, có lẽ điều này ở đây có thể bị ảnh hưởng.
phk

Bash 4.4.20 khắc phục sự cố spinloop trên waitđó trông rất giống với điều này. Tôi đã bị tấn công bởi điều đó trong một vòng lặp sinh ra các quy trình con mãi mãi. Tuy nhiên, tôi đã thử nghiệm kịch bản của bạn vào ngày 4.4.20 và nó vẫn là một vấn đề. Thật thú vị, khi tôi đính kèm một trình gỡ lỗi trên một phiên bản do tôi xây dựng, tôi có thể thấy nó đang lặp đi lặp lại, nhưng nó cũng có tác dụng phá vỡ nó và vòng lặp sẽ bắt đầu xuất hiện lại 'thử nghiệm'. Nói cách khác: gắn trình gỡ lỗi làm cho nó ngừng quay vòng.
Halfgaar

Câu trả lời:


1

Quan sát

  • ctrl+cgửi SIGINTđến tiến trình fg trong Terminal 1
  • do đó, thực thi kill -2 <PID>trong Terminal 2 cũng giống như đánh ctrl+ctrong Terminal 1
  • thực hiện một trong hai điểm trên trước khi thực hiện kill -10 <PID>trong Terminal 2 xử lý SIGINTchính xác
  • thực hiện nó sau khi thực hiện kill -10 <PID>trong Terminal 2 (tín hiệu gửi SIGUSR1) không xử lý SIGINTchính xác và dẫn đến hành vi có vấn đề
  • Việc thay thế kill -2 <PID>trong Terminal 2 ( SIGINT) bằng kill -15 <PID>( SIGTERM) hoặc kill -9 <PID>( SIGKILL) luôn dẫn đến xử lý tín hiệu chính xác.
  • thực thi kill -10 <PID>trong Terminal 2 làm gián đoạn tích hợp waitnhưng không rời khỏi vòng lặp vì testngay lập tức được in sau khi tín hiệu SIGUSR1bị kẹt và vòng lặp tiếp tục.
  • Gửi SIGINTphá vỡ ra khỏi vòng lặp thực thi và đóng băng vỏ hoặc nó không bao giờ bị gián đoạn waitvà chờ đợi / đóng băng.

Phần kết luận

SIGINTkhông được xử lý và xử lý chính xác hoặc nó bị bỏ qua sau khi bẫy thủ công SIGUSR1hoặc có thể bất kỳ bẫy nào do người dùng xác định khác. Điều đó có nghĩa là quá trình này vẫn tồn tại và đó là lý do tại sao nó ăn / làm nóng CPU hoặc đóng băng vỏ. Thực thi kill -15 <PID>hoặc kill -9 <PID>từ Terminal 2 chấm dứt / giết chết quá trình và cung cấp cho bạn quyền kiểm soát đối với Terminal 1 và thư giãn CPU của bạn.

Tại sao vấn đề này xảy ra, vẫn còn là một bí ẩn, nhưng tôi hy vọng ai đó có thể giải thích chính xác những gì đang thực sự xảy ra đằng sau tấm màn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.