Làm thế nào để có được pid của một tiến trình đang chạy bằng một lệnh duy nhất phân tích đầu ra của ps?


22

Tôi đang tìm kiếm một dòng duy nhất trả về giá trị của một quá trình đang chạy.

Hiện tại tôi có:

ps -A -o pid,cmd|grep xxx|head -n 1

Và điều này trả về nắm tay pid, command. Tôi chỉ cần số đầu tiên từ đầu ra và bỏ qua phần còn lại. Tôi cho rằng sedhoặc awksẽ giúp đỡ ở đây nhưng kinh nghiệm của tôi với họ còn hạn chế.

Ngoài ra, điều này có một vấn đề khác, nó sẽ trả về pid của grep nếu xxx không chạy.

Điều thực sự quan trọng là phải có một dòng duy nhất, vì tôi muốn sử dụng lại đầu ra để làm một việc khác, như giết quá trình đó.


1
dẫn nó qua đầu và chỉ định đường trở về với -n 1?
Mike McMahon

Câu trả lời:


28

Nếu bạn chỉ muốn pid của quá trình, bạn có thể sử dụng pgrepnếu có sẵn. pgrep <command>sẽ trả về pid của lệnh (hoặc danh sách các pids trong trường hợp có nhiều hơn một thể hiện của lệnh đang chạy, trong trường hợp đó bạn có thể sử dụng headhoặc các lệnh thích hợp khác)
Hy vọng điều này sẽ giúp!


+1 Cách sử dụng pgrep thông thường của tôi:kill `pgrep xxx`
Steve

20
@steve: Có lẽ bạn nên xem qua pkill.
Tạm dừng cho đến khi có thông báo mới.

7

Chỉ cần một lệnh nữa; bạn chỉ muốn trường đầu tiên từ một dòng các giá trị được phân tách bằng dấu cách:

ps -A -o pid,cmd|grep xxx | grep -v grep |head -n 1 | awk '{print $1}'

Vâng, hai. Tôi đã thêm một grep khác để loại bỏ grep khỏi đầu ra.


6

Chỉ cần sử dụng pgrep, nó sẽ dễ dàng hơn nhiều

pgrep -o -x xxxx

Ở trên chọn quy trình cũ nhất với tên chính xác


Và vì OP muốn sử dụng lệnh để giết tiến trình, pkill(với cùng các đối số) sẽ là lựa chọn trực tiếp nhất.
bstpierre


0

Chạy trên Cygwin vì vậy tôi không thể sử dụng -A và -o, nhưng một cái gì đó như thế này:

$ ps
      PID    PPID    PGID     WINPID   TTY     UID    STIME COMMAND
     4580       1    4580       4580  ?       55573   May 21 /usr/bin/mintty
     5808    7072    5808       7644  pty3    55573 13:35:31 /usr/bin/ps
     7072    5832    7072       6424  pty3    55573   May 21 /usr/bin/bash


$ ps | grep '/usr/bin/mintty' | head -n 1 | awk '{print $1}'
4580

0

bạn có thể làm một cái gì đó như

ps -A -o cmd,pid | egrep "^xxx " | head -n 1 | sed -r -e 's/.* ([0-9]+)$/\1/'

sau đó xxx phải là tên tiến trình và nó sẽ không nhận grep vì neo ^

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.