Mục đích của lệnh bash `Suspend` dựng sẵn là gì?


22

Tôi đã gõ help suspendvà nhận được lời giải thích ngắn gọn này:

suspend: suspend [-f]
    Suspend shell execution.

    Suspend the execution of this shell until it receives a SIGCONT signal.
    Unless forced, login shells cannot be suspended.

    Options:
      -f    force the suspend, even if the shell is a login shell

    Exit Status:
    Returns success unless job control is not enabled or an error occurs.

Làm thế nào tôi hiểu điều này là: Tôi gõ suspendvà thiết bị đầu cuối đóng băng, thậm chí strg + c không thể giải phóng nó. Nhưng khi tôi mở một thiết bị đầu cuối khác và tìm kiếm PID cho thiết bị đóng băng và gõ kill -SIGCONT PID-NRtín hiệu SIGCONT được gửi đến thiết bị đầu cuối bị đóng băng và làm tan nó lên, để nó không bị đóng băng.

Nhưng, mục đích thực sự của việc đình chỉ một thiết bị đầu cuối là gì? Mà mỗi ngày ứng dụng là điển hình cho nó? Những người đã làm cho nó một vỏ được xây dựng trong tâm trí là gì?


2
tránh chạy các chương trình bên ngoài (kill) để tạm ngưng.
Ipor Sircer

Câu trả lời:


23

Nếu bạn bắt đầu một lớp vỏ từ một lớp vỏ khác, bạn có thể treo lớp vỏ bên trong. Nói khi sử dụng suvà muốn quay lại sử dụng thường xuyên trong giây lát:

user$ su
Password: ...
root# do something
root# suspend
user$ do something as the ordinary user again
user$ fg
root# ...

(Nếu bạn làm điều đó, đừng quên lớp vỏ đặc quyền mở trong nền ...)

Tương tự, nếu bạn thoát khỏi trình bao từ một số chương trình khác ( !lệnh trong ví dụ less), bạn vẫn có thể tạm dừng trình bao. Nhưng tôi sẽ không mong đợi nhiều chương trình khác sẽ xử lý nó một cách độc đáo khi chúng khởi chạy một quy trình con, sau đó nó sẽ tự treo.


1
Tôi vừa thử chạy vim, và đã làm :shđể có được một subshell (cụ thể là một zshsubshell). Chạy suspendkhiến tôi rơi vào lớp vỏ ban đầu (nó lơ lửng cả subshell và vim).
Kevin

1
@Kevin, zshcó vẻ thông minh hơn ở chỗ bash, tôi đã cố gắng trốn thoát cả hai lessvi(Debian vim.tiny): cũng zshdừng ứng dụng gốc, bashtreo toàn bộ. bashđể bashlàm việc mặc dù.
ilkkachu

1
tôi đã không nhận thức được rằng những gì tôi gõ sudo su một subshell được bắt đầu. Khi tôi gõ lơ lửng trong vỏ chính, vỏ đơn giản là đóng băng, nhưng cách bạn thể hiện, khi tôi đặt nó bên trong vỏ con, tôi sẽ tự động quay trở lại vỏ chính.
cá mập

25

Đó là tương đương với việc nhấn Ctrl+Ztrong các lệnh khác.

Nó treo shell và đưa lại quyền điều khiển cho shell cha hoặc xử lý nếu có.

Thí dụ:

zsh$ bash
bash-4.4$ cd /
bash-4.4$ suspend
zsh: suspended (signal)  bash
zsh$ fg
[1]  + continued  bash
bash-4.4$ pwd
/

Tính năng này đến từ csh, vỏ của BSD (nơi kiểm soát công việc đến từ đầu những năm 80) .

Trong AT & T ksh, đó là bí danh dựng sẵn cho kill -s STOP $$( có, không có dấu ngoặc kép! )

Trong trường hợp của bạn, bashcó lẽ là cái được bắt đầu trực tiếp bởi trình giả lập thiết bị đầu cuối. Và trình giả lập thiết bị đầu cuối của bạn không mong đợi quá trình bị đình chỉ.

Đó bashlà một người lãnh đạo phiên. Nếu người lãnh đạo phiên bị đình chỉ, nếu chúng tôi xem các thiết bị đầu cuối thời gian cũ, người dùng sẽ không có cách nào để tiếp tục.

bashgiải quyết bằng cách từ chối suspendnếu nó là một vỏ đăng nhập. Nhưng trong trường hợp của bạn, trình giả lập thiết bị đầu cuối của bạn có thể không bắt đầu bashở chế độ đăng nhập, do đó không có biện pháp bảo vệ.

zshmkshkhông gặp vấn đề gì vì họ gửi tín hiệu SIGTSTP(cũng được gửi Ctrl+Z) như csh thay vì SIGSTOP(và cho nhóm quy trình của người gọi mkshnhư trong csh và cho nhóm quy trình chính của shell zsh, chứ không phải cho $$quá trình một mình ). SIGTSTPbị bỏ qua khi được giao cho một nhóm quy trình mồ côi và nhóm của nhà lãnh đạo đủ điều kiện. Ý tưởng là SIGTSTP không nên đình chỉ một cái gì đó mà người dùng không thể tiếp tục.

Trong mkshhoặc yash, người ta cũng có thể sử dụng suspendđể có một subshell đình chỉ chính nó:

$ (set -x; sleep 1; suspend; sleep 2)
+ sleep 1
+ suspend
[1] + Stopped(SIGSTOP)     (set -x; sleep 1; suspend; sleep 2)
$ fg
[1] (set -x; sleep 1; suspend; sleep 2)
+ sleep 2

Điều đó sẽ không hoạt động với zshviệc gửi SIGTSTP đến nhóm quy trình chính thay vì người gọi. Trong bất kỳ shell nào đã killdựng sẵn, người ta luôn có thể sử dụng kill -s TSTP 0thay thế.


4
Bạn có thể trích dẫn một cách sử dụng phổ biến để tạm ngưng là: trong bash (và có thể rất nhiều shell): khi bạn bắt đầu một lệnh dài và không muốn làm gián đoạn nó nhưng bạn muốn làm điều đó trong nền (nghĩa là bạn muốn command .... &nhưng bạn quên &và bây giờ muốn bạn có thể thêm nó mà không làm gián đoạn lệnh): bạn có thể : ctrl-z, và sau đó gõ: bgđể tiếp tục tác vụ bị treo mới nhất trong nền. (hoặc bg %nđể thực hiện việc này với số tác vụ n. Sử dụng jobsđể nhận danh sách các tác vụ bị treo hoặc đang chạy)
Olivier Dulac

5
@OlivierDulac, điều đó sẽ không giải thích suspend lệnh thực tế là gì.
tự đại diệ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.