Làm thế nào để giết một quá trình windows trong một thiết bị đầu cuối cygwin?


18

Tôi có một vấn đề liên quan đến cách tiêu diệt một tiến trình trong Cygwin trên Windows. Tôi hoàn toàn mới với Cygwin. Nhưng tôi có một nhiệm vụ đơn giản là tôi không thể giết được. Tôi đã thử ban hành các lệnh sau:

kill 4568
kill -9 4568
/bin/kill -f 4568

Tôi đã ban hành các lệnh trong một thiết bị đầu cuối Cygwin riêng vì tôi không thể Ctrl + C trong thiết bị đầu cuối Cygwin nơi quá trình chạy. Tôi đã tìm kiếm trên internet mà không thành công.


Quá trình bạn bắt đầu là gì, và bạn đã bắt đầu nó như thế nào?
me_ và

Câu trả lời:


25
ps -W | awk '/calc.exe/,NF=1' | xargs kill -f

Hoặc là

ps -W | awk '$0~v,NF=1' v=calc.exe | xargs kill -f

Hoặc là

powershell kill -n calc

Bạn có thể muốn sử dụng ps -W | awk 'BEGIN{ IGNORECASE=1;} /calc.exe/,NF=1' | xargs kill -fvì Windows không phân biệt chữ hoa chữ thường
tricasse

7

Bạn có thể thử:

taskkill /pid 4568

taskkill /im:{name-of-executable}cũng hữu ích
LawrenceC

taskkill /im <name-of-exe> /fthậm chí còn hữu ích hơn.
Erik Kaplun

1
Câu trả lời không hay, OP đã yêu cầu một lệnh Cygwin.
Hashim

1
Đó là taskkill //im <name-of-exe>(lưu ý sự cần thiết của 2 dấu gạch chéo)
P.Brian.Mackey

5

Nếu bạn muốn một giải pháp chỉ BASH, hãy thử điều này: (nó hiệu quả với tôi)

    KILLPS="<My Process Name>"
    WINPS=`ps -W | grep -i $KILLPS`         # Make case-insensitive.
    PID=`echo $WINPS | cut -d' ' -f1` 
    /bin/kill -f "$PID"

LƯU Ý: sử dụng / bin / kill, việc hủy shell được nhúng sẽ không giết được các PID đối với các cửa sổ chung.


Lưu ý của bạn về / bin / kill vs shell kill rất hữu ích. Cảm ơn
Phil

2

(Từ câu trả lời của tôi cho một câu hỏi tương tự trên SO ):

Các chương trình Windows khác nhau sẽ xử lý các tín hiệu kill gửi khác nhau; chúng chưa bao giờ được thiết kế để đối phó với chúng giống như các chương trình Linux / Cygwin.

Phương pháp đáng tin cậy duy nhất để tiêu diệt chương trình Windows là sử dụng một công cụ cụ thể của Windows, chẳng hạn như Trình quản lý tác vụ hoặc Trình khám phá quy trình.

Điều đó nói rằng, nếu bạn chưa có, bạn có thể gặp may mắn khi chạy thiết bị đầu cuối Cygwin của mình ở chế độ quản trị viên (nhấp chuột phải vào phím tắt của bạn và chọn "Chạy với tư cách quản trị viên").


1

Hai điều cần suy nghĩ ở đây:

  1. Nhận đúng PID, đó là WINPID.
  2. Sử dụng đúng công cụ.

Để có được WINPID chính xác để tiêu diệt, hãy sử dụng cat /proc/<PID>/winpid. Tức là chạy cái này:

ZID=$$; WINPID=$(cat /proc/${ZID}/winpid); echo "Kill WINPID: ${WINPID}"; ps; sleep 10 &

và ngay sau khi làm khác ps.

Các công cụ thích hợp để sử dụng là Sysinternals PsKill64.exe -t <winpid> mà cũng giết chết tất cả các con cháu của quá trình kịch bản, trong đó killkhông.


1
Bạn đã có một phiếu bầu cho cat /proc/${ZID}/winpid, rất tốt để biết. Và nhanh hơn giải pháp với ps -aW | grep ..., ít nhất là trên cygwin của tôi dưới Win 7 x64. Nhưng đối với PsKill64 tôi nghĩ bạn cần -tphải giết các tiến trình con, và taskkillcũng có thể giết các tiến trình con.
244an

Vâng, bạn cũng cần phải -tgiết con cháu. Câu trả lời đúng.
not2qubit

0

Nếu bạn có một chương trình Windows mà là một tiến trình con theo một quy trình bash Cygwin bạn có thể sử dụng taskkill /F /PID [the cygwin process id] /Tđể giết cây quá trình, không cần phải có được Window PID từ psvới awk, vv
Đây được thử nghiệm chịu Win7 x64.

# Simple example in cygwin:
> notepad.exe &
> pid=$!
...
> taskkill /F /PID $pid /T

Tất nhiên bạn cũng có thể sử dụng Window PID.


0

Trong Git Bash tôi sử dụng:

targetProcess='chromedriver.exe';
ps -W | grep -i ${targetProcess} | awk '{print $1}' | while read pid; do taskkill //PID ${pid}; done;

Tôi chưa từng thử nó ở Cygwin, nhưng tôi cho rằng nó cũng sẽ hoạt động ở đó.

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.