Làm cách nào để tìm ID tiến trình (PID) của chương trình thiết bị đầu cuối đang chạy?


117

Tôi đang chạy một chương trình trong thiết bị đầu cuối mà tôi không thể trốn thoát Ctrl- Cvà tôi muốn giết. Làm thế nào tôi có thể tìm thấy PID của nó?


1
Đây là một nhánh của Tôi nên làm gì khi Ubuntu đóng băng? như một tài liệu tham khảo để ngăn chặn các chi tiết trong câu hỏi đó trở nên quá kỹ thuật.
Jjed

Có một lệnh pidof .
neverMind9

Câu trả lời:


128

Mở một thiết bị đầu cuối khác và chạy ps ax | grep footrong đó foo là tên của chương trình không phản hồi. Điều này sẽ trả về một dòng đầu ra trông giống như thế này:

$ ps ax | grep firefox
2222 ?        S      0:00 /bin/sh /usr/lib/firefox-3.6.9/firefox
2231 ?        Sl   514:36 /usr/lib/firefox-3.6.9/firefox-bin
30290 pts/2    S+     0:00 grep --color=auto firefox

Trường đầu tiên của mỗi dòng đầu ra là một số đại diện cho ID tiến trình của chương trình khớp với grep(bạn có thể bỏ qua cái cuối cùng, đại diện cho grepchính nó.

Để tạm dừng quá trình vi phạm, hãy làm: kill pidtrong đó pid là ID tiến trình của chương trình. Bạn có thể phải sử dụng phán đoán của mình về việc trận đấu nào cần phải được chỉnh sửa killhoặc topthay vào đó bạn có thể sử dụng . Việc sử dụng killchính nó sẽ gửi SIGTERM, trước tiên bạn nên thử vì nó cho phép chương trình tự dọn sạch đúng cách. Nếu SIGTERM thất bại, hãy thử SIGHUP, đó là thuốc stonger : kill -HUP pid. Nếu vẫn thất bại, gửi SIGKILL. Nhưng, bạn chỉ nên làm như vậy như là phương sách cuối cùng, bởi vì SIGKILL khiến kernel chấm dứt quá trình ngay lập tức mà không có khả năng dọn dẹp. Điều này đôi khi có thể dẫn đến tham nhũng dữ liệu hoặc các vấn đề khác. Vì vậy, một lần nữa, chỉ gửi SIGKILL như là phương sách cuối cùng. Để làm như vậy, làm kill -KILL pidhoặc kill -9 pid.

Tất nhiên, nếu bạn đang chạy một giao diện đồ họa, bạn không cần phải đánh lừa thứ công cụ dòng lệnh điên rồ này để hoàn thành công việc. Chỉ cần mở "Giám sát hệ thống", điều hướng đến tab Quy trình, chọn quy trình bạn muốn tạm dừng (Hừm, có thể là quy trình sử dụng 90% CPU không?) Và nhấp chuột phải vào nó. Vì quá trình đã dừng lại, (đó là vấn đề, phải không?), Chọn End Process hoặc Kill Process từ menu kết quả.

Tín dụng cho koanhead


5
Mọi người không bao giờ nên sử dụng SIGKILL (kill -9) trừ khi tất cả các phương pháp khác đã thất bại. Chỉ liệt kê kill -9là lời khuyên tồi. Tôi đã chỉnh sửa câu trả lời để sửa nó.
Scott Severance

Làm thế nào tôi có thể tìm thấy pid của một chức năng tùy chỉnh. Tôi có một hàm chứa một vòng lặp với một pinglệnh và sleep. Theo unix.stackexchange.com/a/275826/72988 , không thể có trong Ubuntu nếu không có multiplexer.
Timo

49

Tôi không nghĩ rằng có bất kỳ nhu cầu nào về các lệnh dài như vậy khi bạn có thể thực hiện các lệnh tương tự với pgrep, pkill, pidof, v.v.

  • Để có được một chương trình chạy

pgrep:

   pgrep [options] pattern

MÔ TẢ: pgrep xem qua các quy trình hiện đang chạy và liệt kê các ID quy trình phù hợp với tiêu chí lựa chọn cho thiết bị xuất chuẩn. Tất cả các tiêu chí phải phù hợp. Ví dụ,

  • Để tìm quá trình có tên sshd thuộc sở hữu của root.

    $ pgrep -u root sshd
    
  • Liệt kê các tiến trình thuộc sở hữu gốc OR daemon.

    $ pgrep -u root,daemon
    

pidof:

MÔ TẢ :

Pidof tìm thấy id quá trình (pids) của các chương trình được đặt tên. Nó in những id đó trên đầu ra tiêu chuẩn.

cú pháp: pidof chương trình tên

  • Để giết một chương trình bằng pid, hãy sử dụng ví dụ pkill:

    pkill pid    
    pkill -f process_name    
    pkill -o process_name    
    pkill -n process_name    
    pkill -l process_name
    

    -fcờ: Tìm kiếm cờ process_name (xem man pkill)
    -o: Chỉ chọn phiên bản cũ nhất trong các quy trình khớp.
    -ncờ: Chỉ chọn mới nhất trong các quy trình khớp.
    -lcờ: Liệt kê tên quy trình cũng như ID quy trình.


1
Đây là câu trả lời hay nhất
BlackDivine

21

Cách dễ nhất để biết pid của chương trình đang chạy là sử dụng:

pidof <application name>

Ví dụ: nếu bạn bắt đầu vim và muốn biết pid của nó:

pidof vim

Hãy nhớ rằng bạn sẽ cần cung cấp tên chương trình chính xác đã được bắt đầu.

Ví dụ: nếu bạn đang chạy vi và thực thi, pidof vimbạn sẽ không nhận được kết quả chính xác.

Tham khảo pidoftrang hướng dẫn của để biết thêm.


Điều này không được cài đặt theo mặc định. Nó có thể nằm trong gói sysvinit-utils.
flickerfly

Tôi đã nhận MariaDB. pidof mysqldtrả về một PID. Tuy nhiên, nếu tôi gõ pidof Mariadbkhông có gì được trả lại. Đây có phải là cùng một PID cho cả MariaDB và MySQL không?
Pathros

18

Tôi đã thấy thật tuyệt khi sử dụng một tìm kiếm không phân biệt chữ hoa chữ thường bằng cách thêm "-i" và sử dụng "phụ" thay vì "ax" để có đầu ra mô tả hơn:

ps aux | grep -i firefox

Nếu bạn muốn giết tất cả các quy trình bạn có thể sử dụng:

ps aux | grep -i firefox | awk {'print $2'} | xargs kill -9

Đó là một sự giết chóc mạnh mẽ. Thả "-9" nếu bạn muốn giết mềm.


5
Điều này cũng giết chết ps aux | grep -i firefox...quá trình, bởi vì nó chứa văn bản firefoxtrong lệnh của nó!
Eric

1
@Eric bạn có thể sử dụng grep -i firefo[x]để chỉ khớp với firefox
AD

@ john-foley không bao giờ khuyên bạn nên sử dụng -9với kill, xem tại đây để được giải thích
AD

3

Nếu bạn chỉ muốn pid (hữu ích cho các kịch bản tự động, v.v ...)

pgrep -f desired_program_name

1

Đối với những người đang chạy Ubuntu 16.04 LTS, bạn phải sử dụng ps axvà không chỉps ở dòng lệnh, nếu không, bạn sẽ chỉ nhận được các quy trình sinh ra từ phiên bản thiết bị đầu cuối cụ thể mà bạn đang ở. (Thường chỉ là 'bash' [shell bạn đang ở ] và 'ps' [những gì bạn vừa chạy])


Tôi thích ps -e(hiển thị tất cả) và ps -ejH(hiển thị cây quy trình).
Andrew

1
@Andrew đẹp, điều đó thực sự khá ngọt ngào - cảm ơn vì tiền boa
cygnus_x1

0

Bạn cũng có thể mở một thiết bị đầu cuối khác (hoặc chuyển sang một tty khác) và chạy top, về cơ bản là phiên bản văn bản của System Monitor. Cột đầu tiên liệt kê PID của từng quá trình đang chạy mà bạn có thể tắt bằng cách nhấn K, nhập vào PID và sau đó nhập tín hiệu số để gửi.


0

Bạn có thể làm:

ps ax | grep firefox | cut -f2 -d" " - | xargs kill -9

hai ống đầu tiên có được thông tin về quy trình, tiếp theo chúng tôi cố gắng lấy cột PID bằng cách sử dụng phép cắt trường cũ và sau đó chúng tôi đưa ra kết quả PID để tiêu diệt.


kill -9là khẩu súng lớn nhất bạn phải giết một quá trình. Ban đầu, bạn nên thử một tín hiệu nhẹ nhàng hơn trước khi sử dụng SIGKILL để tạo cơ hội cho quá trình làm sạch tài nguyên của nó.
Chỉ huy Byte

Đó là sự thật @ByteCommander. Tôi muốn làm cho nó một lớp lót sẽ hoàn thành công việc.
Arian Soltani

0
top

hoặc là

screen -list|ls

liệt kê tất cả các pid với quá trình tương ứng

kill -[pid]
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.