Làm thế nào để chấm dứt một quá trình nền?


196

Tôi đã bắt đầu một wget trên máy từ xa trong nền bằng cách sử dụng &. Đột nhiên nó dừng tải xuống. Tôi muốn chấm dứt quá trình của nó, sau đó chạy lại lệnh. Làm thế nào tôi có thể chấm dứt nó?

Tôi đã không đóng cửa sổ vỏ của nó. Nhưng như bạn biết, nó không ngừng sử dụng Ctrl+ CCtrl+ Z.

Câu trả lời:


256

Có nhiều cách để đi về điều này.

Phương pháp số 1 - ps

Bạn có thể sử dụng pslệnh để tìm ID tiến trình cho quy trình này và sau đó sử dụng PID để hủy tiến trình.

Thí dụ

$ ps -eaf | grep [w]get 
saml      1713  1709  0 Dec10 pts/0    00:00:00 wget ...

$ kill 1713

Phương pháp # 2 - pgrep

Bạn cũng có thể tìm ID tiến trình bằng cách sử dụng pgrep.

Thí dụ

$ pgrep wget
1234

$ kill 1234

Phương pháp số 3 - pkill

Nếu bạn chắc chắn đó là lần duy nhất wgetbạn chạy, bạn có thể sử dụng lệnh pkillđể giết công việc theo tên.

Thí dụ

$ pkill wget

Phương pháp số 4 - công việc

Nếu bạn ở trong cùng một vỏ từ nơi bạn điều hành công việc hiện đang được làm nền. Bạn có thể kiểm tra xem nó có chạy hay không bằng cách sử dụng jobslệnh và cũng giết nó bằng số công việc của nó.

Thí dụ

Công việc giả của tôi sleep,.

$ sleep 100 &
[1] 4542

Tìm số công việc. LƯU Ý: số 4542 là ID tiến trình.

$ jobs
[1]+  Running                 sleep 100 &

$ kill %1
[1]+  Terminated              sleep 100

Phương pháp số 5 - fg

Bạn có thể đưa một công việc nền trở lại nền trước bằng cách sử dụng fglệnh.

Thí dụ

Công việc giả mạo sleep,.

$ sleep 100 &
[1] 4650

Lấy số của công việc.

$ jobs
[1]+  Running                 sleep 100 &

Đưa công việc số 1 trở lại nền trước, sau đó sử dụng Ctrl+ C.

$ fg 1
sleep 100
^C
$

Không jobsoutputfg sais : -bash: fg: 1: no such job. Nhưng gõ fghoạt động tốt và cũng pkill wgethoạt động tốt. Nhưng ps -eaf|grep wgetrồi kill <process number>liều không dừng được việc. ps: Tôi sử dụng số thứ ba làm số tiến trình .
Mohammad Etemaddar

1
@MohammadEtemaddar - sử dụng số thứ 2 từ đầu ra của ps. Số thứ 3 là id quá trình của cha mẹ.
slm

1
@MohammadEtemaddar - ah, ps đang tìm grep. Làm như thế này : ps -eaef| grep [w]get.
slm

1
@MohammadEtemaddar - bạn cũng có thể sử dụng pgrepthay thế , pgrep wget.
slm

2
@MohammadEtemaddar - xin lỗi e thêm là lỗi đánh máy. Nên đọc ps -eaf | grep [w]get. Các tùy chọn là trong pstrang người đàn ông. man ps.
slm

70

Trong bash, bạn có thể sử dụng fgđể đưa công việc lên nền trước và sau đó sử dụng Ctrl+C

Hoặc liệt kê quá trình trong nền với jobsvà sau đó làm

kill %1

(với 1 được thay thế bằng số jobsđã cho bạn)


13

Bạn cũng có thể sử dụng kill $!để giết công việc nền gần đây nhất.


Nếu nó được sử dụng như một lệnh như bí danh trong hồ sơ bash, hãy chắc chắn bọc trong các dấu ngoặc đơn.
Nate Ritter

6

EDIT: Khi ở trong nền trước, bạn có thể Ctrl+ C, hoặc như @Zelda đề cập, giết với '% x' trong đó 'x' là số công việc sẽ gửi tín hiệu mặc định (rất có thể là SIGTERM trong trường hợp Linux).

chỉ cần gõ fgđể đưa nó lên nền trước, nếu đó là quá trình cuối cùng bạn làm nền (với '&').

Nếu đó không phải là cái cuối cùng, hãy gõ: jobsvà tìm 'số công việc', được biểu thị trong '[]'. Sau đó chỉ cần gõ:

fg 2

..where '2' là số công việc, ví dụ:

foo@bar:~/junk/books$ jobs
[1]+  Running                 okular how_to_cook_a_turkey.pdf &
foo@bar:~/junk/books$ fg 1
okular how_to_cook_a_turkey.pdf            <- this is now in the foreground.

4

Cách chính xác là gõ jobssau đó sử dụng số công việc để giết nó. Để sử dụng pid để tiêu diệt nó, bạn cần đưa nó lên tiền cảnh như đã lưu ý trong câu trả lời đầu tiên.

Thử đi

~/Desktop$ sleep 1000 &
[1] 7056

~/Desktop$ jobs

[1]+  Running  sleep 1000 &

/Desktop$ kill %1  #(%1 is the job number)

Nếu bạn chạy việc ngay sau khi bạn giết nó, bạn sẽ thấy điều này

Desktop$ jobs
[1]+  Terminated              sleep 1000

4

Một điều tôi không thấy ở đây, điều mà tôi thấy rất hữu ích, đặc biệt là khi thử nghiệm các lệnh, là pidof. Bạn có thể sử dụng pidof [command]để tìm id tiến trình của một tiến trình hiện đang chạy. Tôi thích nó bởi vì nó cho phép tôi nhanh chóng tìm thấy id của lệnh tôi muốn, thường là thứ tôi vừa gọi.

Một khi bạn có pid, bạn chỉ có thể giết quá trình. Nó cho phép tạo các tập lệnh đơn giản để giết một tiến trình chỉ khi nó đang chạy.


1
Ah điều này đã giúp tôi! kill% 1 không hoạt động vì một số lý do, "kill: thất bại trong việc phân tích đối số: '% 1'" và Ctrl + C không hoạt động; không thể tìm thấy tiến trình trong ps hoặc bất cứ điều gì vì nó là root (tôi quên tôi đã sử dụng sudo với nó)
mjohnsonengr

1

Một ví dụ phổ biến là stresscông cụ. Giả sử bạn đã chạy như sau:

$ stress -c 4 -m 4 

và đóng cửa sổ thiết bị đầu cuối. Quá trình sẽ tiếp tục ăn tài nguyên của bạn từ nền.

Tôi ghét những gì tôi làm:

$ x=`pgrep stress` ; sudo kill -9 $x 

pgrepliệt kê các PID của quy trình theo chủ đề và lưu trữ nó thành biến xmà sau đó được sử dụng kill -9để chấm dứt nó.


0

trong quá trình dừng cuối cùng (Ctrl-Z), bạn sẽ giết bằng cách:

kill %%
kill -9 %%

hoặc nếu muốn chọn, hãy sử dụng:

jobs

sau đó:

kill %N

như kill %2

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.