Tìm và giết một tiến trình trong một dòng bằng bash và regex


650

Tôi thường cần phải giết một quá trình trong khi lập trình.

Cách tôi làm bây giờ là:

[~]$ ps aux | grep 'python csp_build.py'
user    5124  1.0  0.3 214588 13852 pts/4    Sl+  11:19   0:00 python csp_build.py
user    5373  0.0  0.0   8096   960 pts/6    S+   11:20   0:00 grep python csp_build.py
[~]$ kill 5124

Làm thế nào tôi có thể trích xuất id quá trình tự động và giết nó trong cùng một dòng?

Như thế này:

[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>

3
Tin tôi đi! : 'D Câu trả lời đầu tiên bạn chọn phức tạp hơn nhiều so với giải pháp bạn đã nói với bạn trong câu trả lời của mình. Tôi thà chọn cách của bạn.
Santosh Kumar

cách tốt nhất để kiểm tra xem có tồn tại quá trình không: stackoverflow.com/questions/3043978/ từ
Trevor Boyd Smith

Câu trả lời:


1400

Trong bash, bạn sẽ có thể làm:

kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')

Chi tiết về hoạt động của nó như sau:

  • Cung pscấp cho bạn danh sách của tất cả các quy trình.
  • Các grepbộ lọc dựa trên chuỗi tìm kiếm của bạn, [p]là một mẹo để ngăn bạn tự chọn grepquy trình thực tế .
  • Trường awkchỉ cung cấp cho bạn trường thứ hai của mỗi dòng, đó là PID.
  • Cấu $(x)trúc có nghĩa là thực thi xsau đó lấy đầu ra của nó và đặt nó trên dòng lệnh. Đầu ra của psđường ống bên trong cấu trúc bên trên là danh sách ID tiến trình để bạn kết thúc bằng một lệnh như thế nào kill 1234 1122 7654.

Đây là bảng điểm cho thấy nó hoạt động:

pax> sleep 3600 &
[1] 2225
pax> sleep 3600 &
[2] 2226
pax> sleep 3600 &
[3] 2227
pax> sleep 3600 &
[4] 2228
pax> sleep 3600 &
[5] 2229
pax> kill $(ps aux | grep '[s]leep' | awk '{print $2}')
[5]+  Terminated              sleep 3600
[1]   Terminated              sleep 3600
[2]   Terminated              sleep 3600
[3]-  Terminated              sleep 3600
[4]+  Terminated              sleep 3600

và bạn có thể thấy nó chấm dứt tất cả những người ngủ.


Giải thích grep '[p]ython csp_build.py'bit chi tiết hơn một chút:

Khi bạn làm sleep 3600 &theo ps -ef | grep sleep, bạn có xu hướng nhận được hai quy trình sleeptrong đó, sleep 3600grep sleep(vì cả hai đều có sleeptrong đó, đó không phải là khoa học tên lửa).

Tuy nhiên, ps -ef | grep '[s]leep'sẽ không tạo ra một quy trình với sleepnó, thay vào đó nó tạo ra grep '[s]leep'và đây là một mẹo nhỏ: grepkhông tìm thấy vì nó tìm biểu thức chính quy "bất kỳ ký tự nào từ lớp nhân vật [s](được s) theo sau leep.

Nói cách khác, nó đang tìm kiếm sleepnhưng quá trình grep grep '[s]leep'không có sleeptrong đó.

Khi tôi được hiển thị cái này (bởi ai đó ở đây trên SO), tôi ngay lập tức bắt đầu sử dụng nó bởi vì

  • đó là một quá trình ít hơn so với việc thêm vào | grep -v grep; và
  • nó thanh lịch lén lút, một sự kết hợp hiếm có :-)

2
@paxdiablo, bạn có thể cung cấp một liên kết cho điều đó? Tôi đang bối rối tại sao nó hoạt động.
glenn jackman

58
Bạn chỉ có thể sử dụng awk - ps aux | awk '/ [b] eam / {print $ 2}' , không cần grep
Yola

20
Tốt hơn là chỉ sử dụng pgrep hoặc pkill
NGix

2
Có một vấn đề nhỏ - nếu quy trình đã bị chấm dứt, dòng sản phẩm killnày sẽ xuất hiện với đầu ra tiêu chuẩnkill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
Lionel Chan

5
Thay vì grep '[p]ython csp_build.py'bạn cũng có thể sử dụng : kill $(ps aux | grep 'python csp_build.py' | grep -v grep | awk '{print $2}'). grep -vtrả về các dòng không khớp.
11/03/2015

138

nếu bạn có tiền

pkill -f csp_build.py

Nếu bạn chỉ muốn grep với tên tiến trình (thay vì danh sách đối số đầy đủ) thì hãy bỏ đi -f.


1
Không có gì xảy ra khi tôi thử nghiệm điều này.
Orjanp

8
sử dụng pgrep trước để xác minh rằng bạn đã xử lý đúng quy trình. sau đó sử dụng pkill một lần nữa trên mẫu chính xác.
ghostdog74

18
+1. pgreppkilllàm việc miễn là bạn cẩn thận để xác định chính xác quy trình. Theo mặc định, chỉ có tên quá trình được khớp, gần như chắc chắn chỉ là "python" trong trường hợp này. Sử dụng pgrep -f "python csp_build.py"để khớp với lệnh đầy đủ.
mr.spuratic

3
Bạn có thể cần phải giết bằngpkill -9 -f csp_build.py
studgeek

1
Đây thực sự phải là câu trả lời được chấp nhận và bình chọn hàng đầu; những cái khác với tất cả các awk'ing là không cần thiết. Tôi hy vọng những người tìm thấy trang này đọc ngoài câu trả lời đầu tiên đó.
Jason C

89

Lót:

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

  • In ra cột 2: awk '{print $2}'
  • sudo Là tùy chọn
  • Chạy kill -9 5124, kill -9 5373v.v (kill -15 duyên dáng hơn nhưng chậm hơn một chút)

Tặng kem:

Tôi cũng có 2 hàm phím tắt được xác định trong .bash_profile của tôi (~ / .bash_profile dành cho osx, bạn phải xem những gì hoạt động cho máy * nix của bạn).

  1. từ khóa p
    • liệt kê ra tất cả các chức năng P có chứa từ khóa
    • cách sử dụng p csp_build, p pythonv.v.

mã bash_profile:

# FIND PROCESS
function p(){
        ps aux | grep -i $1 | grep -v grep
}
  1. từ khóa ka
    • K ills A sẽ xử lý có từ khóa này
    • cách sử dụng ka csp_build, ka pythonv.v.
    • mức giết tùy chọn, ví dụ : ka csp_build 15,ka python 9

mã bash_profile:

# KILL ALL
function ka(){

    cnt=$( p $1 | wc -l)  # total count of processes found
    klevel=${2:-15}       # kill level, defaults to 15 if argument 2 is empty

    echo -e "\nSearching for '$1' -- Found" $cnt "Running Processes .. "
    p $1

    echo -e '\nTerminating' $cnt 'processes .. '

    ps aux  |  grep -i $1 |  grep -v grep   | awk '{print $2}' | xargs sudo kill -klevel
    echo -e "Done!\n"

    echo "Running search again:"
    p "$1"
    echo -e "\n"
}

Nhắc nhở - Đừng quên khởi động lại bash shell (thiết bị đầu cuối) để tải các chức năng mới. HOẶC chạy source ~/.bash_profiletrong trình bao hiện tại để nhập các hàm mới (đây là những gì tôi thích).
a20

Giống như nhiều câu trả lời khác ở đây, điều này bị ảnh hưởng lớn từ việc sử dụng vô íchgrep . Hãy nhớ rằng, bất cứ thứ gì trông giống như grep x | awk '{ y }'thường tốt hơn và thường mạnh mẽ hơn nếu bạn thay thế nó bằngawk '/x/ { y }'
tripleee 15/03/2017

1
@tripleee trang web bạn đang liên kết thuộc về bạn phải không? Tôi nhận thấy bạn đang liên kết nó trên tất cả các phần bình luận khác nhau. Bạn đang cố gắng xây dựng SEO?
a20

Không, tôi không có hứng thú với SEO. Tôi hy vọng sẽ xây dựng nhận thức.
tripleee 15/03/2017

1
.. bằng cách liên kết đến trang web của bạn như thể đó là một trang có thẩm quyền được thiết lập. Đẹp. Ngoài ra, grep là nhanh hơn .
a20

16
killall -r regexp

-r, --regexp

Giải thích mẫu tên quá trình như một biểu thức chính quy mở rộng.


15

Hãy thử sử dụng

ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill

Phải thay đổi nó một chút. Điều này đã làm việc. Cảm ơn. :) ps phụ | grep 'python csp_build.py' | đầu -1 | cắt -d "" -f 5 | giết xargs
Orjanp

3
ps aux | grep 'python csp_build.py' | awk '{print $2}' | xargs killđã làm cho tôi. thanx
Rasika Perera

Hãy nhớ rằng, những đứa trẻ, Awk có thể làm mọi thứ grepcó thể, và hầu hết chỉ đơn giản và thanh lịch. Các trường hợp tầm thường của grep x y | awk '{ z }'luôn luôn được viết tốt hơn awk '/x/ { z }' y- xem sử dụnggrep cũng vô dụng .
tripleee

12

Bạn chỉ có thể sử dụng pkill '^python*' để giết quá trình regex.

Nếu bạn muốn xem những gì bạn sẽ giết hoặc tìm thấy trước khi giết, chỉ cần sử dụng các pgrep -l '^python*'đầu ra -l cũng là tên của quá trình. Nếu bạn không muốn sử dụng pkill, chỉ sử dụng:

pgrep '^python*' | xargs kill


8

Sử dụng pgrep - có sẵn trên nhiều nền tảng:

kill -9 `pgrep -f cps_build`

pgrep -f sẽ trả về tất cả các PID với sự trùng hợp "cps_build"


2
Nếu bạn có pgrep, bạn cũng sẽ có pkill. Như mọi khi, không sử dụngkill -9 trừ khi bạn biết tại sao kill -15(mặc định) hoặc kill -2sẽ không hoạt động.
tripleee

Điều này trông giống như một cách diễn đạt tồi tệ hơn trong câu trả lời của @ nathanael, trong đó bỏ qua phần định hướng sai -9và sử dụng cú pháp thay thế lệnh hiện đại thích hợp. Upvote mà thay vào đó; mặc dù tất nhiên, pkillcâu trả lời vẫn tốt hơn
tripleee

@tripleee Trong trường hợp này, giết -9 chính xác là những gì tôi muốn - chấm dứt tất cả những kẻ phạm tội với định kiến ​​cực đoan. Hơn nữa, tôi đã sử dụng kill -9 trong nhiều năm mà không gặp vấn đề gì. Theo ý kiến ​​của tôi, sẽ luôn có một trại của những người theo chủ nghĩa thuần túy so với một trại của những người thực tế hoàn thành công việc, và tôi thuộc về người sau (trong vấn đề này).
a20

Bạn đã bỏ lỡ phần "trừ khi bạn biết tại sao"? Tôi là tất cả để hoàn thành công việc, nhưng đây là một trong những cách phổ biến để tự bắn vào chân mình cho đến khi bạn hiểu ý -9nghĩa thực sự của nó.
tripleee

@tripleee hey tripleee, gần đây tôi thấy rằng bạn đúng, giết -15 là một lựa chọn tốt hơn vì nó mang lại cho ứng dụng cơ hội để tự giết mình một cách duyên dáng. Tôi đã thay đổi mã của mình cho phù hợp: stackoverflow.com/a/30486159/163382
a20

7

Điều này sẽ chỉ trả lại pid

pgrep -f 'process_name'

Vì vậy, để giết bất kỳ quá trình trong một dòng:

kill -9 $(pgrep -f 'process_name')

hoặc, nếu bạn biết tên chính xác của quy trình, bạn cũng có thể thử pidof:

kill -9 $(pidof 'process_name')

Nhưng, nếu bạn không biết tên chính xác của quy trình, pgrepsẽ tốt hơn.

Nếu có nhiều tiến trình đang chạy với cùng một tên và bạn muốn giết cái đầu tiên thì:

kill -9 $(pgrep -f 'process_name' | head -1)

Cũng cần lưu ý rằng, nếu bạn lo lắng về độ nhạy trường hợp thì bạn có thể thêm tùy chọn -i giống như trong grep. Ví dụ:

kill -9 $(pgrep -fi chrome)

Thông tin thêm về tín hiệu và pgrep tại man 7 signalhoặc man signalman pgrep


5

bạn có thể làm điều đó với awk và backtics

ps auxf |grep 'python csp_build.py'|`awk '{ print "kill " $2 }'`

$ 2 trong awk in cột 2 và các phân tích ngược chạy câu lệnh được in.

Nhưng một giải pháp sạch hơn sẽ là cho quy trình python lưu trữ id tiến trình của nó trong / var / run và sau đó bạn có thể chỉ cần đọc tệp đó và giết nó.


Bạn sẽ giết cả hai quá trình 5124 và 5373 chứ? Tôi đoán đây không phải là một vấn đề.
Orjanp

nó không phải là một vấn đề, nhưng bạn luôn có thể thêm một grep khác để loại trừ quá trình grep: "grep -v grep" giữa grep và awk
Alexander Kjäll

Đã thử nghiệm với một lệnh sửa đổi một chút. Nhưng nó không giết được tiến trình, chỉ in kill <pid>. phụ trợ | grep '[p] ython csp_build.py' | awk '{in "giết" $ 2}'
Orjanp

Chỉ cần hoán đổi bản in "kill" $ 2 bằng một hệ thống ("kill" $ 2). Sau đó, nó hoạt động. :)
Orjanp

5

Nhiệm vụ của tôi là tiêu diệt mọi thứ phù hợp với biểu thức chính quy được đặt trong thư mục cụ thể (sau khi kiểm tra selen không phải mọi thứ đều dừng lại). Điều này làm việc cho tôi:

for i in `ps aux | egrep "firefox|chrome|selenium|opera"|grep "/home/dir1/dir2"|awk '{print $2}'|uniq`; do kill $i; done

Các -9tùy chọn killcó lẽ là quá nông nổi. Nó không cho phép họ giải phóng tài nguyên của họ.
Birei

Đẹp! Người duy nhất cân nhắc thực tế rằng có thể có nhiều hơn một quy trình khớp! Một lưu ý nhỏ: có lẽ bạn có thể muốn thêm "grep -v grep" hoặc một cái gì đó tương tự vào các đường ống, để đảm bảo rằng quy trình grep tự nó không hiển thị trong danh sách quy trình của bạn.
Brad

killchấp nhận nhiều quá trình để vòng lặp về cơ bản là vô dụng; và như đã lưu ý ở những nơi khác trên trang này, bạn không nên sử dụng kill -9trừ khi bạn biết rằng quy trình sẽ không đáp ứng kill.
tripleee

loại bỏ -9 không phải là một vấn đề lớn, tại sao downvote. Bạn nên chỉnh sửa câu trả lời.
Serge

5

Để giết quá trình theo từ khóa midori, ví dụ:

kill -SIGTERM $(pgrep -i midori)


3

Một phương thức chỉ sử dụng awk(và ps):

ps aux | awk '$11" "$12 == "python csp_build.py" { system("kill " $2) }'

Bằng cách sử dụng kiểm tra tính bằng chuỗi, tôi ngăn chặn quá trình này.


Vì một số lý do, tôi không nhận được một cú đánh vào "python csp_build.py". Nhưng "trăn" một mình đánh.
Orjanp

3
ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15

Không thể +1 do giới hạn hàng ngày, nhưng sử dụng psvới -otùy chọn là đáng sử dụng.
P Shved

ps đừng cho tôi nhiều. [~] $ ps PID TTY TIME CMD 6365 điểm / 6 00:00:00 ps 29112 điểm / 6 00:00:00 bash
Orjanp

3

Tặng -f cho pkill

pkill -f /usr/local/bin/fritzcap.py

đường dẫn chính xác của tập tin .py là

# ps ax | grep fritzcap.py
 3076 pts/1    Sl     0:00 python -u /usr/local/bin/fritzcap.py -c -d -m

2

Tôi bắt đầu sử dụng một cái gì đó như thế này:

kill $(pgrep 'python csp_build.py')

1

Giết các quy trình riêng của chúng tôi bắt đầu từ một PPID phổ biến là khá thường xuyên, pkill liên quan đến –Pcờ là một người chiến thắng đối với tôi. Sử dụng ví dụ @ ghostdog74:

# sleep 30 &                                                                                                      
[1] 68849
# sleep 30 &
[2] 68879
# sleep 30 &
[3] 68897
# sleep 30 &
[4] 68900
# pkill -P $$                                                                                                         
[1]   Terminated              sleep 30
[2]   Terminated              sleep 30
[3]-  Terminated              sleep 30
[4]+  Terminated              sleep 30

1

Bạn không cần chuyển đổi người dùng cho ps.

kill `ps ax | grep 'python csp_build.py' | awk '{print $1}'`

1

Trong một số trường hợp, tôi muốn giết các quy trình một cách đồng thời như thế này:

➜ ~ ngủ 1000 &
[1] 25410
➜ ~ ngủ 1000 &
[2] 25415
➜ ~ ngủ 1000 &
[3] 25421
➜ ~ pidof ngủ
25421 25415 25410
Kill ~ giết `pidof ngủ`
[2] - 25415 chấm dứt giấc ngủ 1000                                                             
[1] - 25410 chấm dứt giấc ngủ 1000
[3] + 25421 chấm dứt giấc ngủ 1000

Nhưng, tôi nghĩ rằng nó có một chút không phù hợp trong trường hợp của bạn. (Có thể có đang chạy python a, python b, python x ... trong nền.)


1

Nếu pkill -f csp_build.pykhông giết được tiến trình, bạn có thể thêm -9để gửi một dấu hiệu tiêu diệt sẽ không bị bỏ qua. I Epkill -9 -f csp_build.py


1

Giải pháp sẽ là lọc các quy trình với mẫu chính xác, phân tích cú pháp và xây dựng một danh sách đối số để thực hiện các quy trình tiêu diệt:

ps -ef  | grep -e <serviceNameA> -e <serviceNameB> -e <serviceNameC> |
awk '{print $2}' | xargs sudo kill -9

Giải thích từ thông tin:

tiện ích ps hiển thị một dòng tiêu đề, theo sau là các dòng chứa thông tin về tất cả các quy trình của bạn có các thiết bị đầu cuối kiểm soát.

-e Hiển thị thông tin về các quy trình của người dùng khác, bao gồm cả các quy trình

-f Hiển thị uid, pid, pid cha, sử dụng CPU gần đây, bắt đầu quá trình

Các grep tìm kiếm tiện ích nào cho tập tin đầu vào, chọn dòng

-e mẫu, --regapi = mẫu Chỉ định một mẫu được sử dụng trong quá trình tìm kiếm đầu vào: một dòng đầu vào được chọn nếu nó phù hợp với bất kỳ mẫu nào được chỉ định. Tùy chọn này hữu ích nhất khi nhiều tùy chọn -e được sử dụng để chỉ định nhiều mẫu hoặc khi một mẫu bắt đầu bằng dấu gạch ngang (`- ').

xargs - xây dựng danh sách đối số và thực thi tiện ích

giết - chấm dứt hoặc báo hiệu một quá trình

tín hiệu số 9 - KILL (giết không bắt được, không bắt lửa)

Ví dụ :

ps -ef  | grep -e node -e loggerUploadService.sh - -e applicationService.js |
awk '{print $2}' | xargs sudo kill -9

0

Tôi sử dụng điều này để tiêu diệt Firefox khi kịch bản bị sập và cpu bash :) Thay thế 'Firefox' bằng ứng dụng bạn muốn chết. Tôi đang ở trên vỏ Bash - OS X 10.9.3 Darwin.

kill -Hup $(ps ux | grep Firefox | awk 'NR == 1 {next} {print $2}' | uniq | sort)


Thay thế grep Firefox | awk 'NR == 1 { next } ...'bằng awk 'NR == 1 || $11 !~ /Firefox/ { next } ...'không chỉ tiết kiệm một quá trình, mà còn cải thiện độ chính xác. Nó không khó để thoát khỏi sort | uniqtrong tinh khiết AWK một trong hai (trong khi tất nhiên uniq | sortchỉ là sai - nó sẽ bỏ lỡ bất kỳ bản sao mà không liền nhau, và ẩn các lỗi bằng cách không cần thiết sắp xếp các kết quả của uniq).
tripleee

0

Tôi sử dụng gkill processname, trong đó gkill là tập lệnh sau:

cnt=`ps aux|grep $1| grep -v "grep" -c`
if [ "$cnt" -gt 0 ]
then
    echo "Found $cnt processes - killing them"
    ps aux|grep $1| grep -v "grep"| awk '{print $2}'| xargs kill
else
    echo "No processes found"
fi

LƯU Ý: nó sẽ KHÔNG giết các tiến trình có "grep" trong dòng lệnh của chúng.


1
Giống như nhiều người, nhiều phát minh khác của nhà kho yak, điều này bị thách thức với việc sử dụng vô dụnggrep và các phản hạt kịch bản shell thông thường khác.
tripleee

-1

Lệnh sau sẽ có ích:

kill $(ps -elf | grep <process_regex>| awk {'print $4'})

ví dụ., ps -elf | grep top

    0 T ubuntu    6558  6535  0  80   0 -  4001 signal 11:32 pts/1    00:00:00 top
    0 S ubuntu    6562  6535  0  80   0 -  2939 pipe_w 11:33 pts/1    00:00:00 grep --color=auto top

kill -$(ps -elf | grep top| awk {'print $4'})

    -bash: kill: (6572) - No such process
    [1]+  Killed                  top

Nếu quy trình vẫn bị kẹt, hãy sử dụng tiện ích mở rộng "-9" cho hardkill, như sau:

kill -9 $(ps -elf | grep top| awk {'print $4'})

Mong rằng sẽ giúp ...!


-1

Tìm và giết tất cả các quy trình trong một dòng trong bash.

kill -9 $(ps -ef | grep '<exe_name>' | grep -v 'grep' | awk {'print $2'})
  • ps -ef | grep '<exe_name>'- Cung cấp danh sách các chi tiết quá trình đang chạy (uname, pid, v.v.) phù hợp với mẫu. Danh sách đầu ra bao gồm greplệnh này cũng tìm kiếm nó. Bây giờ để giết chúng ta cần bỏ qua grepquá trình chỉ huy này.
  • ps -ef | grep '<exec_name>' | grep -v 'grep'- Thêm một grep khác với -v 'grep'loại bỏ quá trình grep hiện tại.
  • Sau đó, sử dụng awknhận id quá trình một mình.
  • Sau đó giữ lệnh này bên trong $(...)và chuyển nó sang killlệnh, để giết tất cả quá trình.

-1

Bạn có thể sử dụng lệnh dưới đây để liệt kê pid của lệnh. Sử dụng top hoặc tốt hơn sử dụng htop để xem tất cả quá trình trong linux. Ở đây tôi muốn giết một quá trình có tên

ps -ef | grep '/usr/lib/something somelocation/some_process.js'  | grep -v grep | awk '{print $2}'

Và xác minh pid. Nó phải phù hợp. Để giết chúng sử dụng lệnh kill.

sudo kill -9 `ps -ef | grep '/usr/lib/something somelocation/some_process.js'  | grep -v grep | awk '{print $2}'`

Ví dụ: - là từ danh sách quá trình htop.

sudo kill -9 `ps -ef | grep '<process>'  | grep -v grep | awk '{print $2}'`

Điều này giải quyết vấn đề của tôi. Luôn luôn sẵn sàng để khởi động lại quá trình nếu bạn vô tình giết chết một 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.