it-swarm-vi.tech

Tìm và giết một tiến trình trong một dòng bằng cách sử dụng bash và regex

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>
558
Orjanp

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:

  • ps cung cấp cho bạn danh sách tất cả các quy trình.
  • Các bộ lọc grep dựa trên chuỗi tìm kiếm của bạn, [p] là một mẹo để ngăn bạn chọn grep xử lý chính nó.
  • awk chỉ cung cấp cho bạn trường thứ hai của mỗi dòng, đó là PID.
  • Cấu trúc $(x) có nghĩa là thực thi x sau đó lấy đầu ra của nó và đặt nó trên dòng lệnh. Đầu ra của đường dẫn ps 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ư 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 bit grep '[p]ython csp_build.py' chi tiết hơn một chút:

Khi bạn thực hiện sleep 3600 & theo sau là ps -ef | grep sleep, bạn có xu hướng nhận hai xử lý với sleep trong đó, sleep 3600grep sleep (vì cả hai có sleep trong đó, đó 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 quy trình với sleep trong đó, thay vào đó, nó tạo ra grep '[s]leep' và đây là một mẹo nhỏ: grep không tìm thấy biểu thức thông thường lớp nhân vật [s] (là s) theo sau là leep.

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

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 | grep -v grep; và
  • nó thanh lịch lén lút, một sự kết hợp hiếm có :-)
1240
paxdiablo

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ỏ -f.

118
ghostdog74

Lót:

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

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

Tiền thưởng:

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. p từ khóa [.__.]
    • liệt kê ra tất cả P rocesses có chứa từ khóa
    • sử dụng, ví dụ: p csp_build, p python, v.v.

mã bash_profile:

# FIND PROCESS
function p(){
        ps aux | grep -i $1 | grep -v grep
}
  1. ka từ khóa [.__.]
    • K ills A sẽ xử lý có từ khóa này
    • sử dụng, ví dụ: ka csp_build, ka python, v.v.
    • mức tiêu diệ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"
}
79
a20

Hãy thử sử dụng

ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill
14
Rahul
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.

13
Miron Yanovskiy

Bạn chỉ có thể sử dụng pkill '^python*' để hủy quy 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 pgrep -l '^python*' trong đó -l cũng xuất ra 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

9
NGix

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"

6
user3115782

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

kill -SIGTERM $(pgrep -i midori)

5
l3v1ath4n

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 chỉ cần đọc tệp đó và giết nó.

5
Alexander Kjäll

Nhiệm vụ của tôi là tiêu diệt mọi thứ phù hợp với regex đượ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
4
Serge

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.

3
schot

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
3
Robert1968
ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15
3
Vijay

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

kill $(pgrep 'python csp_build.py')
2
Nathanael

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 & [. ] 25421 [.__.] ➜ ~ pidof ngủ [.__.] 25421 25415 25410 [.__.] ➜ ~ giết `pidof ngủ` [.__.] 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
kashu.org

Giết các quy trình riêng của chúng tôi bắt đầu từ một PPID là khá thường xuyên, pkill liên quan đến cờ –P 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
Juan Diego Godoy

Đ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, pgrep sẽ 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 signal hoặc man signalman pgrep

1
Rakib Fiha

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
Alex V

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.

0
Kostyantyn

Tôi sử dụng điều này để giế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 Bash Shell - OS X 10.9.3 Darwin.

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

0
mrhassell