Có những công việc bị dừng lại (trên bash exit)


158

Tôi nhận được thông báo There are stopped jobs.khi tôi cố gắng thoát khỏi bash shell. Đây là một kịch bản có thể tái tạo trong python 2.x:

  • ctrl+ cđược xử lý bởi trình thông dịch là một ngoại lệ.
  • ctrl+ z'dừng' quá trình.
  • ctrl+ dthoát trăn cho thực tế.

Đây là một số đầu ra thiết bị đầu cuối trong thế giới thực:

example_user@example_server:~$ python
Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

ctrl+z

[1]+  Stopped                 python
example_user@example_server:~$ exit
logout
There are stopped jobs.

Bash đã không thoát, tôi phải exitmột lần nữa để thoát khỏi bash shell.

  • Q: "Công việc bị dừng" là gì, hoặc điều này có nghĩa là gì?
  • Q: Một quá trình dừng lại có thể được nối lại?
  • Q: Người đầu tiên exitgiết công việc đã dừng?
  • Q: Có cách nào để thoát khỏi vỏ lần đầu tiên không? (không nhập exithai lần)

ctrl + shift + \ cũng sẽ thực hiện thoát python.
ThorSummoner

Câu trả lời:


206

Một công việc bị dừng là một công việc đã tạm thời được đưa vào nền và không còn chạy nữa, nhưng vẫn đang sử dụng tài nguyên (tức là bộ nhớ hệ thống). Vì công việc đó không được gắn vào thiết bị đầu cuối hiện tại, nó không thể tạo đầu ra và không nhận được đầu vào từ người dùng.

Bạn có thể thấy các công việc bạn đang chạy bằng jobslệnh dựng sẵn trong bash, có thể là các shell khác. Thí dụ:

user@mysystem:~$ jobs
[1] + Stopped                python
user@mysystem:~$ 

Bạn có thể tiếp tục công việc đã dừng bằng cách sử dụng fglệnh tích hợp bash (foreground). Nếu bạn có nhiều lệnh đã bị dừng, bạn phải chỉ định lệnh nào sẽ tiếp tục bằng cách chuyển số jobspec trên dòng lệnh với fg. Nếu chỉ có một chương trình bị dừng, bạn có thể sử dụng fgmột mình:

user@mysystem:~$ fg 1
python

Tại thời điểm này, bạn quay lại trình thông dịch python và có thể thoát bằng cách sử dụng control-D.

Ngược lại, bạn có thể killra lệnh với lệnh jobspec hoặc PID. Ví dụ:

user@mysystem:~$ ps
  PID TTY          TIME CMD
16174 pts/3    00:00:00 bash
17781 pts/3    00:00:00 python
18276 pts/3    00:00:00 ps
user@mysystem:~$ kill 17781
[1]+  Killed                  python
user@mysystem:~$ 

Để sử dụng jobspec, hãy đặt trước số có phím phần trăm (%):

user@mysystem:~$ kill %1
[1]+  Terminated              python

Nếu bạn đưa ra lệnh thoát với các công việc đã dừng, cảnh báo bạn đã thấy sẽ được đưa ra. Các công việc sẽ được để lại cho an toàn. Điều đó để đảm bảo rằng bạn biết rằng bạn đang cố gắng giết các công việc mà bạn có thể đã quên bạn đã dừng lại. Lần thứ hai bạn sử dụng lệnh exit, các công việc bị chấm dứt và thoát khỏi trình bao. Điều này có thể gây ra sự cố cho một số chương trình không có ý định bị giết theo kiểu này.

Trong bash, có vẻ như bạn có thể sử dụng logoutlệnh sẽ giết các tiến trình đã dừng và thoát. Điều này có thể gây ra kết quả không mong muốn.

Cũng lưu ý rằng một số chương trình có thể không thoát khi bị chấm dứt theo cách này và hệ thống của bạn có thể kết thúc với rất nhiều quá trình mồ côi sử dụng hết tài nguyên nếu bạn có thói quen làm điều đó.

Lưu ý rằng bạn có thể tạo quy trình nền sẽ dừng nếu họ yêu cầu người dùng nhập liệu:

user@mysystem:~$ python &
[1] 19028
user@mysystem:~$ jobs
[1]+  Stopped                 python

Bạn có thể tiếp tục và tiêu diệt những công việc này giống như cách bạn đã làm những công việc mà bạn đã dừng lại với sự Ctrl-zgián đoạn.


4
Tôi sẽ ngụy biện với câu thứ hai của bạn. Nó nên nói, bởi vì công việc bị dừng lại , nó không thể thực hiện bất kỳ hành động nào - tệp I / O, I / O mạng, I / O của thiết bị đầu cuối hoặc bất kỳ quá trình xử lý nào khác. Hãy
Scott

2
Điều này giúp tôi rất nhiều.
shellbye

Tuyệt vời bài giúp đỡ tuyệt vời cho bất kỳ ai!
George Udosen

18

Q: "Công việc bị dừng" là gì, hoặc điều này có nghĩa là gì?

Công việc bị dừng có nghĩa là quá trình nhận tín hiệu dừng ( SIGSTOP/ SIGTSTP) từ bàn phím (ký tự tạm dừng Ctrl-Z), lệnh (ví dụ kill -STOP [PID]) hoặc quy trình khác (ví dụ: kernel khi hệ thống thiếu tài nguyên) và nó ở trạng thái tạm dừng, do đó, nó báo cho hệ thống dừng / tạm dừng một quá trình vì vậy nó sẽ không thực hiện bất kỳ thực thi / xử lý.

Công việc shell hoạt động có thể được liệt kê bởi : jobs.

Q: Một quá trình dừng lại có thể được nối lại?

Quá trình dừng sẽ chỉ tiếp tục thực hiện nếu nó được gửi SIGCONTtín hiệu. Điều này có thể đạt được bằng cách fg(hoặc fg ID) sẽ chuyển công việc sang nền trước biến nó thành công việc hiện tại, bgđể tiếp tục công việc đó trong nền hoặc bằng cách gửi SIGCONTtín hiệu (ví dụ kill -CONT [PID]).

Q: Lối thoát đầu tiên có giết chết các công việc đã dừng không?

Lần đầu tiên khi bạn nhập exit/ logouthoặc nhấn Ctrl-D, trình bao sẽ in một thông báo cảnh báo về các công việc đang hoạt động hiện tại được liên kết với thiết bị đầu cuối của bạn, do đó nó sẽ không giết bạn mà không có sự cho phép của bạn bằng cách xác nhận hành động lần thứ hai. Nếu checkjobstùy chọn được bật ( shopt -s checkjobs), nó cũng có thể liệt kê các công việc với trạng thái của chúng.

Q: Có cách nào để thoát khỏi vỏ lần đầu tiên không? (không nhập hai lần)

Bạn có thể nhấn Ctrl+Dhai lần hoặc giữ nó lâu hơn, điều này sẽ thoát khỏi vỏ yên lặng nhanh chóng giết chết các công việc tạm dừng / chạy hiện tại.

Hoặc từ chối chúng ( disown) để bỏ chúng hoặc giết chúng bằng tay : kill $(jobs -p).

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.