Làm thế nào để chỉ người dùng, pid và lệnh chạy cho một quy trình cụ thể? (Ubuntu 11.10)


19

Khi tôi làm ps -ef|grep pythontôi nhận được như sau:

myusername  4492  2994  0 10:32 pts/0    00:00:01 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root        6665     1  0 10:42 ?        00:00:00 /usr/bin/python /usr/lib/system-service/system-service-d
myusername 14051 13497  0 11:28 pts/7    00:00:00 grep --color=auto python

Làm thế nào để tôi chỉ nhận được người dùng đang chạy tiến trình, pidlệnh chạy cho quá trình như trong đầu ra sau đây?

myusername  4492 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root        6665 /usr/bin/python /usr/lib/system-service/system-service-d

Nó có hoạt động không? ps --fields="user pid command"
pratnala

Đừng thử nó. Tìm thấy nó trên mạng. Không phải gần một máy Ubuntu bây giờ. Lấy làm tiếc. Sẽ gặp lại sau và cho bạn biết
pratnala

Không, tôi nhận được LRI: Tùy chọn gnu dài không xác định. Nó làm việc cho bạn?
Bentley4

Câu trả lời:


13

Tôi đoán bạn đang tìm kiếm đối số -o:

-o định dạng:

định dạng do người dùng định nghĩa. định dạng là một đối số duy nhất ở dạng danh sách được phân tách bằng dấu phẩy hoặc được phân tách bằng dấu phẩy, cung cấp một cách để chỉ định các cột đầu ra riêng lẻ. Các từ khóa được công nhận được mô tả trong phần THÔNG SỐ KỸ THUẬT TIÊU CHUẨN bên dưới. Các tiêu đề có thể được đổi tên (ps -o pid, ruser = RealUser -o comm = Command) theo ý muốn. Nếu tất cả các tiêu đề cột trống (ps -o pid = -o comm =) thì dòng tiêu đề sẽ không được xuất ra. Chiều rộng cột sẽ tăng khi cần thiết cho các tiêu đề rộng; điều này có thể được sử dụng để mở rộng các cột như WCHAN (ps -o pid, wchan = WIDE-WCHAN-COLUMN -o comm). Kiểm soát chiều rộng rõ ràng (ps opid, wchan: 42, cmd) cũng được cung cấp. Hành vi của ps -o pid = X, comm = Y thay đổi theo tính cách; đầu ra có thể là một cột có tên "X, comm = Y" hoặc hai cột có tên "X" và "Y". Sử dụng nhiều tùy chọn -o khi nghi ngờ. Sử dụng biến môi trường PS_FORMAT để chỉ định mặc định như mong muốn; DefSysV và DefBSD là các macro có thể được sử dụng để chọn các cột UNIX hoặc BSD mặc định.

Vì vậy, lệnh bạn muốn sẽ là (Ubuntu):

ps -o uid,pid,cmd -ef|grep python

trong OpenSolaris lệnh là:

ps -o ruser,pid,comm -ef|grep python

3
Điều đó thực sự làm việc cho bạn? Khi tôi chạy lệnh đó, tôi nhận đượcWarning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
Bentley4

Có nó hoạt động với tôi trong ksh theo OpenSolaris. Đầu ra là như bạn mong muốn ... Kiểm tra các trang man cho ps trên hệ thống của bạn man ps. Có thể cú pháp hơi khác nhau trên hệ thống của bạn.
Simon

1
Nhưng OP đang bash chứ không phải trên ksh
pratnala

1
@ Bentley4 Nếu bạn chỉ muốn lệnh và không cần thêm thông tin, bạn có thể bỏ tham số -f và sử dụng lệnh sau:ps -o uid,pid,cmd -e|grep python
Simon

1
@ Bentley4:ps -o user,pid,cmd -e|grep '[p]ython'
Simon

3

Đơn giản nhất có lẽ sẽ là:

$ ps o uid=,pid=,cmd= -C python
1000 26126 python

Bằng cách đó bạn có được mọi thứ trực tiếp psvà không cần phải phân tích bất cứ điều gì.

Từ pstrang người đàn ông:

-o định dạng Định dạng do người

dùng xác định. định dạng là một đối số ở dạng danh sách được phân tách bằng dấu phẩy hoặc được phân tách bằng dấu phẩy, cung cấp một cách để chỉ định các cột đầu ra riêng lẻ. [...] Các tiêu đề có thể được đổi tên (ps -o pid, ruser = RealUser -o comm = Command) như mong muốn. Nếu tất cả các tiêu đề cột trống (ps -o pid = -o comm =) thì dòng tiêu đề sẽ không được xuất ra.

-C cmdlist
     Select by command name.  This selects the processes whose executable 
     name is given in cmdlist.

Các -Ctùy chọn sẽ làm việc nếu bạn đang chạy pythonmột cách tương tác, không nếu trăn đang chạy một kịch bản. Trong trường hợp đó bạn nên sử dụng -C scriptname.pythay thế.


1

Phiên bản PS của tôi thì khác, vì vậy nó có thể yêu cầu một số điều chỉnh, nhưng bạn có thể sử dụng cắt (và có thể tr tùy thuộc vào những gì bạn đang cố gắng đạt được) - ví dụ như một cái gì đó như

ef | cắt -c1-16,50-   

Sẽ cung cấp các ký tự 1-16 và 50 trở đi từ mỗi dòng của câu lệnh ps của bạn. (Số thực tế của bạn có thể sẽ cần một chút xoa bóp).

Một cách khác để làm điều đó (nhưng bạn sẽ mất định dạng) có thể là

ef | tr -s "" | cắt -f1,2,8- -d ""

Cái nào sẽ nén khoảng trắng trong lệnh ps, sau đó lấy các trường 1,2 và 8 trở đi và hiển thị chúng.


Chỉ với một quy trình, tôi nhận được một nửa trang thông tin trên toàn màn hình với các lệnh đó. Nó khá khó đọc, tôi đang 'xoa bóp' các thông số nhưng cho đến nay tôi vẫn chưa thể có được bất cứ thứ gì từ xa về những gì tôi muốn.
Bentley4

1
ps -eo user,pid,cmd | grep [p]ython

Thí dụ:

$ ps -eo user,pid,cmd | grep [p]ython
root      1056 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
root      1735 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
bmaupin  16613 /usr/bin/python3 /usr/share/system-config-printer/applet.py

Giải trình:

  • -e tất cả các quy trình
  • -o định dạng do người dùng định nghĩa
  • user,pid,cmd Hiển thị người dùng, ID quá trình, cột lệnh

Lưu ý: nếu bạn sử dụng -fvới -enhư những người khác đã gợi ý, bạn có thể nhận lỗi. Điều này là do cả hai tham số này kiểm soát định dạng đầu ra và chỉ nên sử dụng một trong số chúng:

$ ps --help | grep -A 2 "output format"
*********** output format **********
-o,o user-defined  -f full
-j,j job control   s  signal
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.