Làm thế nào tôi có thể giết một quá trình theo tên thay vì PID?


349

Đôi khi khi tôi cố gắng khởi động Firefox thì nó báo "một quy trình Firefox đã chạy". Vì vậy, tôi phải làm điều này:

jeremy@jeremy-desktop:~$ ps aux | grep firefox
jeremy    7451 25.0 27.4 170536 65680 ?        Sl   22:39   1:18 /usr/lib/firefox-3.0.1/firefox
jeremy    7578  0.0  0.3   3004   768 pts/0    S+   22:44   0:00 grep firefox
jeremy@jeremy-desktop:~$ kill 7451

Điều tôi muốn là một lệnh sẽ làm tất cả điều đó cho tôi. Nó sẽ lấy một chuỗi đầu vào và grepcho nó (hoặc bất cứ thứ gì) trong danh sách các quy trình và sẽ giết tất cả các quy trình trong đầu ra:

jeremy@jeremy-desktop:~$ killbyname firefox

Tôi đã thử thực hiện nó trong PHP nhưng exec('ps aux')dường như chỉ hiển thị các quy trình đã được thực thi exec()trong chính tập lệnh PHP (vì vậy quy trình duy nhất mà nó hiển thị là chính nó.)


Khi tôi nhận được cửa sổ thông báo rằng Firefox đã chạy, tôi thường phải đợi một giây và tôi có thể chạy lại Firefox (tất nhiên có thể không phải lúc nào cũng như vậy).
nuoritoveri

1
Đây là cách an toàn nhất như JohnB nói trong câu trả lời này: stackoverflow.com/questions/6381229/iêu
tecnoshopbq


Đây là một câu hỏi cũ, nhưng bạn có thể vui lòng thay đổi câu trả lời được chấp nhận không? Quá trình bạn đánh dấu không thành công với nhiều quy trình, giống như các quy trình do JVM chạy.
Luís de Sousa

Đối với bất kỳ ai tham khảo chủ đề này, trong phần bình luận ở trên, Luis đang tham khảo câu trả lời bên dưới để thực hiện pkill -f "Process name"lệnh ...
Digger

Câu trả lời:


505

7
Sử dụng pgrep để tìm ra những gì bạn đang giết trước khi bạn thực hiện các quy trình giết người là một điều tốt. Đặc biệt là khi sử dụng -f.
Akrikos

pkill không thân thiện lắm. bạn không thể đặt tên cho nó giống như cách killall lấy chúng.
Bạch tuộc

2
pkill -U <username>là khá tiện dụng. Tôi có một máy chủ web Solaris , trình nền máy chủ web thực tế, được thiết lập dưới dạng Dịch vụ với người dùng của chính nó. Vì vậy, chỉ định bởi người dùng là một cách đơn giản / dễ dàng để kích hoạt khởi động lại.
Raystorm

6
Buộc giết: pkill -9 firefox
Justas

Điều này làm việc một nửa lần tốt nhất. Bạn cần ít nhất là -fcờ cho một giải pháp omnibus.
Luís de Sousa

112

Cũng có thể sử dụng:

pkill -f "Process name"

Đối với tôi, nó hoạt động hoàn hảo. Đó là những gì tôi đã tìm kiếm. pkill không hoạt động với tên mà không có cờ.

Khi -fđược đặt, dòng lệnh đầy đủ được sử dụng để khớp mẫu.


2
đặc biệt để chạy một cái gì đó với rượu , -ftùy chọn là thực sự cần thiết. ví dụpkill -f "EvilWindowsServer.exe"
CodeBrauer

Đây phải là câu trả lời được chấp nhận. Câu trả lời đầu tiên thất bại với nhiều loại chương trình, ví dụ như những chương trình đang chạy trên JVM.
Luís de Sousa

1
Tôi cũng phải thêm -fcờ để giết tiến trình nền chạy tập lệnh Python.
Mason

trong trường hợp của tôi, tôi cần 2 lá cờ:pkill -f -9 PROCESSNAME
Slasta

công việc của nó trong centos7.thank
sirmagid

64

Bạn có thể giết các tiến trình theo tên vớikillall <name>

killall gửi tín hiệu đến tất cả các tiến trình đang chạy bất kỳ lệnh nào được chỉ định. Nếu không có tên tín hiệu được chỉ định, SIGTERM được gửi.

Tín hiệu có thể được chỉ định bằng tên (ví dụ -HUP hoặc -SIGHUP ) hoặc theo số (ví dụ -1 ) hoặc theo tùy chọn -s .

Nếu tên lệnh không phải là biểu thức chính quy (tùy chọn -r ) và chứa dấu gạch chéo (/), các quy trình thực thi tệp cụ thể đó sẽ được chọn để giết, không phụ thuộc vào tên của chúng.

Nhưng nếu bạn không thấy quá trình này ps aux, có lẽ bạn sẽ không có quyền giết nó ...


6
Để buộc chấm dứt chương trình không phản hồi, hãy gửi KILL thay vì HẠN:killall -s KILL firefox
Martin Hansen

45

Một thay thế dài hơn một chút:

kill `pidof firefox`

25
pidof firefox | xargs kill -9
hbt

1
cái này hoạt động dưới busybox cho các thiết bị nhúng của bạn :)
nwgat 24/07/2015

25

Cách dễ nhất để làm là trước tiên hãy kiểm tra xem bạn có nhận được ID quy trình đúng với:

pgrep -f [part_of_a_command]

Nếu kết quả như mong đợi. Đi với:

pkill -f [part_of_a_command]

19

Lạ thật, nhưng tôi chưa thấy giải pháp như thế này:

kill -9 `pidof firefox`

nó cũng có thể giết nhiều tiến trình (nhiều pids) như:

kill -9 `pgrep firefox`

Tôi thích pidofvì nó có đầu ra dòng đơn:

> pgrep firefox
6316
6565
> pidof firefox
6565 6316

Khi tôi thực hiện điều này, tôi đã nhận được lỗi kill: invalid number 'pidof myprogram'. Điều gì là xấu ở đây?
Brethlosze

Điều này chỉ cứu cuộc sống của tôi ngày hôm nay ... Tôi không muốn viết thêm nhưng tôi vui vì tôi đã tìm thấy nó ở đây. cảm ơn người đàn ông
MilMike

1
Đến muộn nhưng trong trường hợp người khác thắc mắc về @Brethlosze, bạn hãy đánh dấu vào một lần duy nhất, trong khi lệnh yêu cầu backticks.
quang phổ

Cảm ơn! .. tôi sẽ (và tôi đang) nhận thức được những backticks này :)
Brethlosze

13

Giết tất cả các quá trình có snippettrong đường dẫn khởi động. Bạn có thể tắt tất cả các ứng dụng bắt đầu từ một số thư mục bằng cách đặt / thư mục / dưới dạng đoạn trích. Điều này khá hữu ích khi bạn bắt đầu một số thành phần cho cùng một ứng dụng từ cùng một thư mục ứng dụng.

ps ax | grep <snippet> | grep -v grep | awk '{print $1}' | xargs kill

* Tôi sẽ ưu tiên pgrep nếu có sẵn


1
Đây là một sự kết hợp thường thấy của các phản hạt. Sử dụng một biểu thức chính không khớp với chính nó (hoặc tên của tập lệnh chứa) và tránh việc vô dụnggrep . ps ax | awk '/[s]nippet/ { print $1 }' | xargs kill
tripleee 27/11/18

1
trong khi tránh grep vô dụng, bạn không tránh lỗi chính tả và khả năng sử dụng lệnh trong các quy trình tự động tham số hóa <snippet>
Mike

Đây thực sự là cách tốt nhất để làm điều đó!
Abhinandan Dubey

Sẽ rất tuyệt để hiểu lý do tại sao @ tripleee [s]hoạt động trong điều kiện không phù hợp với chính quy trình awk?
andig

Vì regex [x]ykhớp với chuỗi xynhưng không phải ngược lại. Đây là một câu hỏi thường gặp. Liên kết là một trang từ hơn 20 năm trước giải thích điều này chi tiết hơn; và đây là một câu hỏi định kỳ rồi.
tripleee

11

Trên Mac tôi không thể tìm thấy pgrep và pkill cũng không phải killall hoạt động nên đã viết một tập lệnh đơn giản: -

export pid=`ps | grep process_name | awk 'NR==1{print $1}' | cut -d' ' -f1`;kill $pid

Nếu có một cách dễ dàng hơn để làm điều này thì xin vui lòng chia sẻ.


1
Cười lớn. Đây là một lệnh điên rồ cho nhiệm vụ như vậy. Đừng bận tâm. Bạn đã gọi một dòng đơn giản? : D Đơn giản là killall
m3nda

@ erm3nda :-) Đồng ý. Nhìn lại có vẻ điên rồ. Không thể nhớ lại tại sao killall không hoạt động trên máy Mac của tôi.
Dhiraj

Điều này rất hữu ích khi bạn muốn giết một quy trình Java nhất định như "jboss". Trong trường hợp đó, killall không giúp được gì.
Jan M


6

Để giết bằng grep:

kill -9 `pgrep myprocess`

5

đúng hơn sẽ là:

export pid=`ps aux | grep process_name | awk 'NR==1{print $2}' | cut -d' ' -f1`;kill -9 $pid

1
Tại sao bạn exportlà một biến mà bạn sẽ chỉ sử dụng một lần trong cùng một quy trình?
tripleee 27/11/18


3

Tôi đã tự hỏi mình câu hỏi tương tự nhưng vấn đề với các câu trả lời hiện tại là họ không kiểm tra an toàn các quy trình bị giết nên ... nó có thể dẫn đến những sai lầm khủng khiếp :) ... đặc biệt là nếu một số quy trình khớp với mẫu .

Là một từ chối trách nhiệm, tôi không phải là một chuyên gia và chắc chắn có chỗ để cải thiện.

Vì vậy, tôi đã viết một kịch bản sh nhỏ:

#!/bin/sh

killables=$(ps aux | grep $1 | grep -v mykill | grep -v grep)
if [ ! "${killables}" = "" ]
then
  echo "You are going to kill some process:"
  echo "${killables}"
else
  echo "No process with the pattern $1 found."
  return
fi
echo -n "Is it ok?(Y/N)"
read input
if [ "$input" = "Y" ]
then
  for pid in $(echo "${killables}" | awk '{print $2}')
  do
    echo killing $pid "..."
    kill $pid 
    echo $pid killed
  done
fi

2

Nếu bạn chạy Gnome, bạn có thể sử dụng trình giám sát hệ thống (Hệ thống-> Quản trị-> Giám sát hệ thống) để tiêu diệt các tiến trình như trong Windows. KDE sẽ có một cái gì đó tương tự.


2

Lệnh mặc định killchấp nhận tên lệnh thay thế cho PID. Xem giết (1) . Một rắc rối thường xảy ra là bashcung cấp riêng của killnó chấp nhận số công việc, như kill %1, nhưng không phải tên lệnh. Điều này cản trở lệnh mặc định. Nếu chức năng trước hữu ích với bạn hơn chức năng sau, bạn có thể tắt bashphiên bản bằng cách gọi

enable -n kill

Để biết thêm thông tin xem killenablecác mục trong bash (1) .


Làm thế nào tôi reenable hành động đã làm bởi enable -n kill?
Brethlosze

1
@hyprfrcbenable kill
The Vee



0

awk oneliner, phân tích cú pháp tiêu đề psđầu ra, vì vậy bạn không cần quan tâm đến số cột (nhưng tên cột). Hỗ trợ regex. Ví dụ: để giết tất cả các quy trình, tên thực thi nào (không có đường dẫn) có chứa từ "firefox" hãy thử

ps -fe | awk 'NR==1{for (i=1; i<=NF; i++) {if ($i=="COMMAND") Ncmd=i; else if ($i=="PID") Npid=i} if (!Ncmd || !Npid) {print "wrong or no header" > "/dev/stderr"; exit} }$Ncmd~"/"name"$"{print "killing "$Ncmd" with PID " $Npid; system("kill "$Npid)}' name=.*firefox.*
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.