Điều này đúng với bất kỳ hệ vỏ nào có kiểm soát công việc, mà (đối với hầu hết các phần) bạn có thể được cấp trừ khi xử lý một vỏ thực sự cổ xưa. Đó là trong tiêu chuẩn POSIX , do đó, thậm chí còn dash
hỗ trợ kiểm soát công việc (khi chạy tương tác hoặc với -m
).
Tương tác
- Ctrl+ zsẽ tạm dừng chương trình hiện tại
bg
sẽ làm nền cho chương trình bị đình chỉ gần đây nhất
(sử dụng bg %2
với số công việc mà bạn có thể kiểm tra jobs
)
fg
sẽ báo trước chương trình bị đình chỉ gần đây nhất
Trong zsh
, bạn có thể viết một ràng buộc khóa để chạy ngầm fg
từ dấu nhắc thông qua dấu Ctrl+ khác z:
_zsh_cli_fg() { fg; }
zle -N _zsh_cli_fg
bindkey '^Z' _zsh_cli_fg
Có lẽ cũng có một cách thông minh để chạy ngầm bg
khi đình chỉ, nhưng có vẻ không khôn ngoan; ít nhất là đối với tôi, phần lớn việc sử dụng Ctrl+ của tôi zlà vì Ctrl+ ckhông thoát ra được; Tôi muốn làm theo điều đó với ví dụ kill %1
chứ không phải bg
, và tôi chắc chắn không muốn mặc định giết người! (Logic này cũng mở rộng lý do tại sao tôi không còn sử dụng ràng buộc khóa này nữa: Nếu tôi đang gõ vào Ctrl+ zđể dừng một quá trình, điều cuối cùng tôi muốn nó làm là tiếp tục!)
Không tương tác
Nếu bạn ở trong một phiên bản shell khác (hoặc một người dùng khác, đôi khi bao gồm sudo
các lệnh), bạn có thể sẽ không thể sử dụng số công việc.
Bạn vẫn có thể hành động trên một quy trình khác sau khi bạn biết ID quy trình của nó (PID). Bạn có thể nhận được PID với pgrep …
, hoặc ps aux |grep …
(hoặc từ cùng một vỏ jobs -l
, hoặc $!
) và sau đó bạn có thể chạy:
kill -STOP $PID # suspend
kill -CONT $PID # continue (resume)
Nếu bạn không biết ID tiến trình và không lo lắng về việc tạm dừng các phiên bản khác của quy trình theo tên, bạn có thể truyền tín hiệu cho một trong những điều sau:
killall -STOP program_name
pkill -STOP program_name
pkill -f -STOP program_name_or_args
Một CONT
tín hiệu cho một chương trình đã dừng với Ctrl+ z(chứ không phải bg
'd) sẽ tiếp tục tiến trình của nó (ở nền trước), giống như khi bạn thực hiện fg
nó.
Re: Lỗi tiêu chuẩn
Chỉnh sửa cho câu hỏi này hỏi về lỗi tiêu chuẩn:
Quá trình xuất ra stderr, vậy tôi sẽ phát lệnh như thế nào fg <jobid>
trong khi quá trình xuất ra thiết bị đầu cuối?
Trừ khi công việc được đề cập có các thành phần được làm nền (hoặc toàn bộ công việc được tạo nền, có lẽ thông qua kill -CONT
), bạn thực sự không nên thấy đầu ra trong khi nó bị treo.
Nếu nó vẫn xuất dữ liệu (có thể là đầu ra tiêu chuẩn hoặc lỗi tiêu chuẩn), nó chắc chắn sẽ làm cho thiết bị đầu cuối của bạn bị lộn xộn, nhưng tất cả đầu ra đó sẽ bị bỏ qua vì nó không phải là một phần của đầu vào của bạn. Điều này có thể làm cho khó biết bạn chưa nhập bất kỳ lỗi chính tả nào, nhưng gõ (mù) fg
Entersẽ đủ (trừ khi bạn có nhiều công việc và câu hỏi không phải là gần đây nhất, trong trường hợp đó bạn thực sự sẽ cần mô tả công việc ).
Nếu bạn cần tìm mô tả công việc, hãy sử dụng một thiết bị đầu cuối khác để gửi STOP
tín hiệu thông qua các phương thức không tương tác ở trên. Điều này sẽ giải phóng màn hình của bạn (có thể nhấn Entermột vài lần hoặc chạy clear
hoặc Ctrl+ L) để bạn có thể chạy jobs
để tìm mô tả công việc và sau đó chạy số fg %N
đó ở đâu N
.