Một ví dụ thực tế của việc sử dụng lệnh đình chỉ trong Bash là gì?


12

suspendlà một lệnh dựng sẵn trong Bash. Khi nào bạn sẽ tự nhiên sử dụng lệnh này và thấy nó hữu ích?


1
Shell tự treo bất cứ khi nào nó tạo ra một tiến trình con, tức là chạy một lệnh trong đó lệnh đã nói là một chương trình bên ngoài, yêu cầu một fork/execcuộc gọi hệ thống
the_velour_fog

1
Trong một vỏ tương tác, điều này cho phép tiến trình con có được quyền điều khiển thiết bị đầu cuối, trong khi không có vỏ cha mẹ tương tác với thiết bị đầu cuối, điều này trở nên lộn xộn.
the_velour_fog

2
@velour, nhưng điều đó không yêu cầu chạy một lệnh riêng biệt để có hiệu lực đó?
ilkkachu

@the_velour_fog Về mặt kỹ thuật, vỏ cha mẹ không bị treo (nó không nhận được STOPtín hiệu) khi nó tạo ra một tiến trình con. Tôi cũng có một chút bối rối bởi bình luận thứ hai của bạn.
Kusalananda

1
@Kusalananda ok, wait()nghe có vẻ hợp lý với tôi. Tôi nói cái vỏ lơ lửng mỗi khi nó tạo ra một quá trình con . Tôi đã không nói bất cứ điều gì về việc nhận bất kỳ tín hiệu dừng, điều đó sẽ vô nghĩa.
the_velour_fog

Câu trả lời:


14

Giả sử bạn thiếu cả GNU screentmux(và X11 bảng điều khiển ảo) nhưng muốn chuyển đổi giữa vỏ đăng nhập và vỏ tương tác khác.

Trước tiên, bạn sẽ đăng nhập vào bảng điều khiển, sau đó bắt đầu một vỏ mới, tạm thời chặn vỏ đăng nhập. Để lấy lại vỏ đăng nhập để thực hiện một số công việc ở đó, bạn sẽ làm suspend. Sau đó, bạn sẽfg có được vỏ tương tác trở lại để tiếp tục với bất cứ điều gì bạn đã làm ở đó.

Trong thực tế, với kiểm soát công việc, shell đăng nhập có thể sinh ra một số shell tương tác làm công việc nền mà bạn có thể chuyển sang fg %1, fg %2v.v., nhưng để quay lại shell đăng nhập, bạn sẽ cần sử dụngsuspend trừ khi bạn muốn thủ công kill -s STOP $$.

Cũng lưu ý rằng Ctrl+ Ztại dấu nhắc trong trình bao tương tác sẽ không tạm dừng nó.

EDIT: Ban đầu tôi có một phần giả thuyết dài về việc sử dụng suspendtập lệnh, nhưng vì lệnh yêu cầu kiểm soát công việc và vì các shell không tương tác thường không có kiểm soát công việc, tôi đã xóa phần đó.


Phần bị xóa với suspendthay thế bởikill -s STOP $$ (điều này thực sự không thuộc về câu trả lời nữa, nhưng dù sao nó cũng có thể thú vị với người khác):

Giả sử bạn có một quy trình nền (tập lệnh) trong tập lệnh và quy trình nền này ở giai đoạn nào đó cần phải dừng lại và chờ quá trình cha mẹ diễn ra để tiếp tục. Điều này có thể để cha mẹ có thời gian trích xuất và di chuyển các tệp vào vị trí hoặc một cái gì đó tương tự.

Tập lệnh con sẽ tạm dừng ( kill -s STOP $$) và tập lệnh cha sẽ gửi CONTtín hiệu đến tập lệnh đó khi có thể tiếp tục.

Nó cho bạn cơ hội để thực hiện một loại đồng bộ hóa giữa quy trình cha và quy trình con (mặc dù rất cơ bản vì quy trình vỏ cha mẹ ít nhiều cần phải đoán rằng quy trình con bị đình chỉ, mặc dù điều này có thể được khắc phục bằng cách có con bẫy CONTvà không treo nếu tín hiệu đó được nhận quá sớm).

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.