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
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
Câu trả lời:
Khi sử dụng nohup
và 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 PID
hoặ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 nohup
từ 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_command
lư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 2
là bộ mô tả tệp cho lỗi tiêu chuẩn ( stderr
) và báo 2>&1
cho 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>&1
là 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.log
tậ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.log
hoặ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
nohup
là 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
2
là mô tả tệp "lỗi tiêu chuẩn". >
là chuyển hướng shell và &1
là 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 > &1
chuyể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.log
phươ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 .
echo $!
cung cấp cho tôi pid của nohup thay vì quá trình sinh ra: paste.fedoraproject.org/428697/99695314
&
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ó.
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:
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 :)
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
ps -ef
và kill
cả hai đều được bảo vệ tốt ở trên, vậy phần mới là gì?
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. ;)
kill -9
trừ khi bạn biết rằng tín hiệu thông thường không hoạt động.
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.
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}
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
process not found
nhầm lẫn với nohup.
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:
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.ps -ef
lệ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.lsof -i:port
nế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 command
và 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.
nohup
và sử dụng nó sau này chokill
hoặc tìm quá trình theo tên lệnh của nó trongps -ef
đầu ra và lấy PID từ đó. Bạn phải tìm tên lệnh, khôngnohup
.