Tại sao ctrl + c trong bảng điều khiển giết quá trình nền


4

Bạn có thể giải thích tại sao Ctrl+ Ctrong bashshell của tôi ảnh hưởng đến lệnh đã chạy trước đó trong nền với:

`./my_script.sh 1` &

Lệnh ngay lập tức kết thúc việc thực hiện với 130mã:

[1]+  Exit 130              `./my_script.sh 1` &

Hành vi thông thường của Ctrl+ Clà giết tiến trình tiền cảnh. Và chuyện gì xảy ra ở đây?

Chỉnh sửa 1: (Suy nghĩ của tôi) có thể là một cái gì đó liên quan đến backticks - ở đây quá trình subshell con bắt đầu và bằng cách nào đó nó nhận được Ctrl+ Ckhi quá trình cha mẹ nhận được nó

Chỉnh sửa 2: Tôi thấy rằng Ctrl+ Cdừng tất cả các quá trình nền được chạy từ trình bao hiện tại với việc sử dụng backticks.


Đó có phải là lệnh trước được nhập vào shell của bạn không?
bgStack15

@bgStack Đừng hiểu: đó là ./my_script.sh 1&. Hay bạn hỏi về lệnh cuối cùng trước Ctrl-C?
John_West

Quên để thoát khỏi backticks trong bình luận trước. Nên đọc là:`./my_script.sh 1` &
John_West

Câu trả lời:


1

Khi bạn viết lệnh

`./my_script.sh 1` &

bạn đang thực hiện thay thế lệnh (xem bên dưới).
Thực tế, bạn đang thực hiện một subshell (cái dành cho backticks ``) trong nền ( &) trong đó nó chạy script của bạn ( ./my_script.sh 1).

Các vỏ hiện đang chờ kết thúc việc thực hiện subshell của nó để chạy sản lượng của nó như lệnh.
Các subshell đang chờ cuối kịch bản của bạn.
Khi bạn nhấn Ctrl + Cbạn làm gián đoạn sự chờ đợi này, truyền tín hiệu SIGINTcho trẻ.

Trong thời điểm này, trình bao hiện tại cố gắng chạy như lệnh đầu ra thu được cho đến bây giờ ... và nó tạo ra lỗi 130có nghĩa là "Tập lệnh bị chấm dứt bởi Control-C" [ 2 ] .


Với backticks ``, cũng như với $()bash, bạn đang thực hiện thay thế lệnh [ 1 ] :

Bash thực hiện việc mở rộng bằng cách thực hiện LỰA CHỌN và thay thế lệnh thay thế bằng đầu ra tiêu chuẩn của lệnh, với bất kỳ dòng mới nào bị xóa.

ví dụ

echo `date`   
Thu Feb 6 10:06:20 CET 2003 

Lưu ý rằng nếu bạn chạy trong nền nhiều loại lệnh này

`./myscript 1` &
`./myscript 2` &
`./myscript 3` &

nó luôn là cái vỏ hiện tại đang chờ tất cả đầu ra của con. Một Ctrl+ Csẽ kết thúc điều này chờ đợi cho tất cả cùng nhau.

Nếu thay vào đó, bạn sẽ đợi kết thúc tập lệnh, trình bao hiện tại sẽ cố gắng thực hiện đầu ra của chúng vì chúng sẽ kết thúc.


Vâng, nó thực sự thực hiện đầu ra! Cám ơn vì đã giải thích! Và "truyền tín hiệu SIGINTcho trẻ" là hành vi mặc định của bash? Hay chỉ khi sử dụng thay thế lệnh?
John_West

1
Thứ hai bạn nói. BTW thực hiện một số thử nghiệm ... sleep 10; echo okdưới dạng tập lệnh ... &... ctrl c ... hãy tận hưởng thời gian của bạn!
Hastur
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.