Thay thế cho `pkill` hoặc` pgrep -f` trên cygwin?


8

Giả sử tôi đã bắt đầu quá trình của mình như:

java -DSOME_STRING -jar foo.jar

Sau đó, trên linux, tôi có thể sử dụng cách sau để tìm hoặc tắt tiến trình này:

pgrep -f SOME_STRING
pkill -f SOME_STRING

Tuy nhiên điều này dường như không hoạt động trên cygwin. Bất cứ ai cũng có thể đề xuất một sự thay thế cho các công cụ này trong cygwin?


1
Không hoạt động theo cách nào? Không giết quá trình, không tìm thấy quy trình để giết nó? Đưa ra một lỗi?
EightBitTony

pgrep không tìm thấy quá trình. pkill không giết quá trình.
bộ công cụ

Dưới đây là các triển khai killallpidofchế tạo cho Cygwin. Phụ thuộc vào Python 2 / - github.com/kata198/cygwin-ps-misc
Tim Savannah

Câu trả lời:


16

pkill và pgrep chắc chắn tồn tại trong Cygwin, trong gói Procps (bạn có thể tìm kiếm các gói cygwin tại đây ).

Nó xuất hiện để làm việc cho tôi,

tony:~$ nohup sleep 100983 &
[1] 5476
tony:~$ nohup: ignoring input and appending output to `nohup.out'
tony:~$
tony:~$ ps -ef | grep sleep
    tony    5476    2696   2  23:28:53 /usr/bin/sleep
tony:~$ pkill -f sleep
[1]+  Terminated              nohup sleep 100983
tony:~$

tony:~$ nohup sleep 837746 &
[1] 228
tony:~$ nohup: ignoring input and appending output to `nohup.out'
tony:~$ pgrep -f 837746
228
tony:~$ pkill -f 837746
[1]+  Terminated              nohup sleep 837746
tony:~$

Cập nhật: được, thử nghiệm với java. Việc thực thi java từ dòng lệnh Cygwin không dẫn đến chuỗi java được đặt vào /proc/<pid>/cmdline, chỉ chứa -bash. Điều này dường như là một hạn chế của Cygwin.

tony:~$ java -Dsomething=valid -jar Captor.jar &
[1] 2700
tony:~$ ps -ef
     UID     PID    PPID TTY     STIME COMMAND
    tony    4164       1   ?    Aug 21 /usr/bin/mintty
    tony    4676    4164   0    Aug 21 /usr/bin/bash
    tony    5776    4676   0    Aug 23 /usr/bin/ssh
    tony    5148       1   ?  23:53:03 /usr/bin/mintty
    tony    5332    5148   1  23:53:03 /usr/bin/bash
    tony    5816       1   ?  00:04:16 /usr/bin/mintty
    tony    5432    5816   2  00:04:16 /usr/bin/bash
    tony    2700    5432   2  00:04:34 /cygdrive/c/Windows/system32/java
    tony    2232    5432   2  00:04:39 /usr/bin/ps
tony:~$ pgrep -f something
tony:~$ cat /proc/2700/cmdline
-bash
tony:~$
tony:~$ cat /proc/2700/exename
/cygdrive/c/Windows/system32/java

Do đó, tôi nghi ngờ, câu trả lời là bạn không thể làm điều này với công cụ Cygwin, bạn sẽ cần một công cụ cụ thể của Windows.


Ví dụ của bạn về cơ bản khác với ví dụ mà OP đang cố gắng. Bạn đã khớp tên của quy trình chứ không phải là một chuỗi tùy ý trong các đối số của nó. Bạn có thể kiểm tra cái sau và xem nếu nó hoạt động?
Caleb

dường như hoạt động tốt
EightBitTony

Có vẻ như Procps không có sẵn cho x64 cygwin.
thameera

1
@thameera thử gói procps-ng.
Abdull

1
apt-cyg install procps-ngvới Cygwin mới nhất
Timo

4

Các tiện ích Cygwin hoạt động giống như các tiện ích Linux, nhưng chúng chỉ hoạt động trên các quy trình Cygwin. Đối với các quy trình của Windows, bạn cần sử dụng các tiện ích của Windows, chẳng hạn như các tiện ích từ Sysiternals . PsKill có thể giết các tiến trình theo tên.


4
như người bản địataskkill /f /im procname.exe
Marcos

2
pscũng hiển thị các quy trình của Windows với công -Wtắc
golimar

4

Trong các phiên bản Cygwin cũ hơn, có một procpsgói mà bạn có thể cài đặt để có cùng chức năng với các lệnh tương tự.

Trong các phiên bản Cygwin mới hơn, procpsgói không còn tồn tại và được thay thế bằng gói procps-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.