Làm thế nào để có được ID tiến trình để giết quá trình nohup?


203

Tôi đang chạy một quá trình nohup trên máy chủ. Khi tôi cố gắng giết nó, giao diện điều khiển putty của tôi đóng lại.

đây là cách tôi cố gắng tìm ID tiến trình:

ps -ef |grep nohup 

đây là lệnh giết

 kill -9 1787 787

6
Bạn đang cố gắng để giết nó từ một kịch bản hoặc tại dòng lệnh? Bạn cần phải lưu PID khi bạn thực hiện nohupvà sử dụng nó sau này cho killhoặc tìm quá trình theo tên lệnh của nó trong ps -efđầu ra và lấy PID từ đó. Bạn phải tìm tên lệnh, không nohup.
lừa đảo

1
@mbratch Bạn nên đưa ra câu trả lời thay vì bình luận.
Ansgar Wiechers

@AnsgarWiechers cảm ơn vì lời đề nghị. Đôi khi nếu câu trả lời của tôi rất ngắn gọn hoặc nếu tôi không chắc chắn nó hoàn toàn bao gồm những gì OP đang hỏi, tôi ngần ngại đăng nó dưới dạng câu trả lời. Tôi đã thêm một câu trả lời và bao gồm thêm thông tin.
lừa đảo

Câu trả lời:


352

Khi sử dụng nohupvà bạn đặt tác vụ ở chế độ nền, toán tử nền ( &) sẽ cung cấp cho bạn PID tại dấu nhắc lệnh. Nếu kế hoạch của bạn là quản lý quy trình theo cách thủ công, bạn có thể lưu PID đó và sử dụng nó sau để giết tiến trình nếu cần, thông qua kill PIDhoặc kill -9 PID(nếu bạn cần buộc giết). Ngoài ra, bạn có thể tìm thấy PID sau này ps -ef | grep "command name"và xác định vị trí của PID từ đó. Lưu ý rằng nohuptừ khóa / lệnh tự nó không xuất hiện trong psđầu ra cho lệnh đang đề cập.

Nếu bạn đã sử dụng một tập lệnh, bạn có thể làm một cái gì đó như:

nohup my_command > my.log 2>&1 &
echo $! > save_pid.txt

Điều này sẽ chạy my_commandlưu tất cả đầu ra vào my.log(trong một tập lệnh, $!đại diện cho PID của quá trình cuối cùng được thực hiện). Đây 2là bộ mô tả tệp cho lỗi tiêu chuẩn ( stderr) và báo 2>&1cho trình vỏ định tuyến đầu ra lỗi tiêu chuẩn đến đầu ra tiêu chuẩn (bộ mô tả tệp 1). Nó đòi hỏi &1để shell biết nó là một bộ mô tả tệp trong ngữ cảnh đó thay vì chỉ một tệp có tên 1. Các 2>&1là cần thiết để nắm bắt được bất kỳ thông báo lỗi mà thường được ghi vào sai số chuẩn của chúng tôi vào my.logtập tin (được phát ra từ đầu ra tiêu chuẩn). Xem Chuyển hướng I / O để biết thêm chi tiết về cách xử lý chuyển hướng I / O bằng vỏ.

Nếu lệnh gửi đầu ra một cách thường xuyên, thỉnh thoảng bạn có thể kiểm tra đầu ra tail my.loghoặc nếu bạn muốn theo dõi "trực tiếp" bạn có thể sử dụng tail -f my.log. Cuối cùng, nếu bạn cần giết tiến trình, bạn có thể thực hiện thông qua:

kill -9 `cat save_pid.txt`
rm save_pid.txt

15
Nói rõ hơn một chút, đó không phải nohuplà bản in, nó in ra bản PID, đây là bản cuối cùng của &nó, ví dụ như ls &sẽ hiển thị PID để chạyls
karmakaze

1
'2> & 1' làm gì?
Viraj

4
@Viraj 2là mô tả tệp "lỗi tiêu chuẩn". >là chuyển hướng shell và &1là mô tả tệp "đầu ra tiêu chuẩn" ( &cần thiết ở đây để shell không nghĩ rằng tôi đang đề cập đến một tệp có tên 1). Vì vậy, 2 > &1chuyển hướng bất kỳ đầu ra lỗi tiêu chuẩn đến đầu vào tiêu chuẩn. Vì các > my.logphương tiện trước để chuyển hướng đầu ra tiêu chuẩn sang my.log, chúng tôi cần một cách để đảm bảo rằng các thông báo lỗi cũng đi đến my.log. 2 > &1đảm bảo rằng các lỗi như vậy đi đến đầu ra tiêu chuẩn, lần lượt xảy ra my.log. Xem I / O Redirection .
lừa đảo

6
echo $!cung cấp cho tôi pid của nohup thay vì quá trình sinh ra: paste.fedoraproject.org/428697/99695314
Nehal J Wani

1
@Mvorisek &hoạt động như một dấu phân cách lệnh để bạn có thể thử sh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt". Nó có thể hoạt động, nhưng tôi đã không thử nó.
vay

91

Tôi đang sử dụng linux mũ đỏ trên máy chủ VPS (và thông qua SSH - putty), đối với tôi, những điều sau đây đã hoạt động:

Đầu tiên, bạn liệt kê tất cả các quy trình đang chạy:

ps -ef

Sau đó, trong cột đầu tiên bạn tìm thấy tên người dùng của bạn; Tôi đã tìm thấy nó ba lần sau đây:

  • Một là kết nối SSH
  • Thứ hai là kết nối FTP
  • Cái cuối cùng là quá trình nohup

Sau đó, trong cột thứ hai, bạn có thể tìm thấy PID của quá trình nohup và bạn chỉ gõ:

kill PID 

(dĩ nhiên thay thế PID bằng quy trình xử lý nohup)

Và đó là nó!

Tôi hy vọng câu trả lời này sẽ hữu ích cho ai đó tôi cũng rất mới với bash và SSH, nhưng đã tìm thấy 95% kiến ​​thức tôi cần ở đây :)


3
Tôi nghĩ bạn có nghĩa là PID thay vì UID ở đây?
wprins

Tôi đồng ý với @wprins. Giết UID không có tác dụng với tôi, nhưng giết chết PID thì có.
Ryan

Trong trường hợp của tôi, tôi đã chạy một kịch bản shell thử nghiệm (long_rasty_script.sh) với nohup và & và dint biết làm thế nào để ngăn chặn nó. Cuối cùng, tôi đã làm một ps -ef | grep long_rucky * và làm hỏng PID. Sau đó, đã giết chết PID
Rennish Joseph

50

giả sử tôi đang chạy tập lệnh ruby ​​trong nền với lệnh bên dưới

nohup ruby script.rb &

sau đó tôi có thể lấy thông tin về quá trình nền ở trên bằng cách chỉ định tên lệnh. Trong trường hợp của tôi lệnh là ruby.

ps -ef | grep ruby

đầu ra

ubuntu   25938 25742  0 05:16 pts/0    00:00:00 ruby test.rb

Bây giờ bạn có thể dễ dàng giết tiến trình bằng cách sử dụng lệnh kill

kill 25938

1
Sanjay, chỉ để tôi chắc chắn rằng tôi không thiếu thứ gì, phần nào trong câu trả lời của bạn là mới hoặc khác với câu trả lời được cung cấp nhiều năm trước? ps -efkillcả hai đều được bảo vệ tốt ở trên, vậy phần mới là gì?
David C. Rankin

2
ps -ef sẽ cung cấp cho bạn danh sách dài đầu ra và việc tìm kiếm từ danh sách dài này sẽ khó khăn. vì vậy tôi nghĩ rằng ps -ef | grep ruby ​​là lệnh tốt hơn để tìm kiếm pid hơn là chỉ thực hiện ps
-ef

20

công việc -l sẽ cung cấp cho bạn pid cho danh sách các quy trình nohup. giết (-9) chúng nhẹ nhàng. ;)


11
Chỉ khi công việc được bắt đầu trong shell hiện tại. Và đừng kill -9trừ khi bạn biết rằng tín hiệu thông thường không hoạt động.
tripleee 4/2/2016

1
Điều này rất hữu ích, nếu bạn đang ở trên một số hình ảnh
docker

5

Bạn có thể thử

kill -9 `pgrep [command name]`

2
rất đẹp! Tôi đã sử dụng pkill [command name]bạn có thể sử dụng -ocờ để giết quá trình khớp cũ nhất hoặc -nđể sử dụng quy trình mới nhất thay thế.
zanona

4

Cái này hoạt động trong Ubuntu

Nhập cái này để tìm hiểu PID

ps aux | grep java

Tất cả quá trình chạy liên quan đến java sẽ được hiển thị

Trong trường hợp của tôi là

johnjoe      3315  9.1  4.0 1465240 335728 ?      Sl   09:42   3:19 java -jar batch.jar

Bây giờ hãy giết nó kill -9 3315

Quá trình zombie cuối cùng đã dừng lại.


4

Giả sử bạn đang thực hiện một chương trình java với nohup, bạn có thể nhận được id process process bằng cách

`ps aux | grep java`

đầu ra

xxxxx     9643  0.0  0.0  14232   968 pts/2   

sau đó bạn có thể giết tiến trình bằng cách gõ

sudo kill 9643

hoặc giả sử rằng bạn cần phải giết tất cả các quy trình java sau đó chỉ cần sử dụng

sudo killall java

Lệnh này giết tất cả các bộ xử lý java. bạn có thể sử dụng điều này với quá trình. chỉ cần đặt tên quy trình ở cuối lệnh

sudo killall {processName}

2

Khi bạn tạo một công việc trong nohup, nó sẽ cho bạn biết ID tiến trình!

nohup sh test.sh &

đầu ra sẽ hiển thị cho bạn ID tiến trình như

25013

bạn có thể giết nó sau đó:

kill 25013

1

Tôi bắt đầu máy chủ django với lệnh sau.

nohup manage.py runserver <localhost:port>

Điều này hoạt động trên CentOS:

:~ ns$netstat -ntlp
:~ ns$kill -9 PID 

Đây là cách để giải quyết sự process not foundnhầm lẫn với nohup.
CodeSpent

0

Hôm nay tôi gặp vấn đề tương tự. Và vì đã lâu lắm rồi, tôi hoàn toàn quên mất mình đã sử dụng lệnh nào và khi nào. Tôi đã thử ba phương pháp:

  1. Sử dụng STIME được hiển thị trong ps -ef lệnh. Điều này cho thấy thời gian bạn bắt đầu quá trình của mình và rất có thể bạn sẽ không ra lệnh ngay trước khi bạn đóng ssh (tùy thuộc vào bạn). Thật không may, tôi không nghĩ rằng lệnh mới nhất là lệnh tôi chạy bằng cách sử dụng nohup, vì vậy điều này không hiệu quả với tôi.
  2. Thứ hai là PPID, cũng được hiển thị trong ps -eflệnh. Nó có nghĩa là ID tiến trình cha, ID của quá trình tạo ra quy trình. Ppid là 1 trong ubfox cho quá trình sử dụng nohup để chạy. Sau đó, bạn có thể sử dụngps --ppid "1" để lấy danh sách và kiểm tra TIME (tổng thời gian CPU sử dụng quy trình của bạn) hoặc CMD để tìm PID của quy trình.
  3. Sử dụng lsof -i:portnếu quá trình chiếm một số cổng và bạn sẽ nhận được lệnh. Sau đó, giống như câu trả lời ở trên, sử dụng ps -ef | grep commandvà bạn sẽ nhận được PID.

Một khi bạn tìm thấy PID của quá trình, sau đó có thể sử dụng kill pidđể kết thúc quá trình.

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.