Có cách nào để chọn theo một số điều kiện trong `ps` không?


12

Có vẻ như tôi đang thiếu một cái gì đó rõ ràng, nhưng vẫn:

ps -f -u myuser --ppid 1

Có vẻ như chỉ nhìn vào pid cha của tiến trình và trả về tất cả các tiến trình có pid cha là 1 - ngay cả khi người dùng không myuser.

Một -umình hoạt động chính xác (chỉ chọn các quá trình của myuser):

ps -f -u myuser

Tôi đang thiếu gì? Có một số cách tích hợp để lọc theo một số điều kiện trong ps?

EDIT: Cách giải quyết hiện tại của tôi:

ps -f -p $(join <(ps h --ppid 1 -o pid | sort) <(ps h -u myuser -o pid | sort))

Câu trả lời:


12

pslà khó chịu theo cách đó. May mắn thay, có pgrep, có các tùy chọn lựa chọn tương tự, nhưng yêu cầu tất cả chúng phải khớp và sau đó xuất ra các pids phù hợp. Theo mặc định, nó xuất ra một dòng trên mỗi dòng, nhưng nó có thể được yêu cầu sử dụng một dấu phân cách khác để nó sẽ hoạt động với ps:

ps -f -p"$(pgrep -d, -u $USER -P 1)"

4

Thật không may, pschỉ có thể bỏ chọn, dường như không có andtoán tử hoặc khả năng thêm các sàng lọc.

Tuy nhiên, bạn có thể tranh thủ sự giúp đỡ pgrepđể có được danh sách các PID và cung cấp thông tin đó ps. Ví dụ:

$ ps -f $(pgrep -P 1 -u saml)
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
saml      1986     1  0 Jul25 ?        SLl    0:00 /usr/bin/gnome-keyring-daemon --daemonize --login
saml      2003     1  0 Jul25 ?        S      0:00 dbus-launch --sh-syntax --exit-with-session
saml      2004     1  0 Jul25 ?        Ss     0:23 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
saml      2147     1  0 Jul25 ?        S      0:04 /usr/libexec/gconfd-2
saml      2156     1  0 Jul25 ?        Ssl    0:09 /usr/libexec/gnome-settings-daemon
saml      2162     1  0 Jul25 ?        S      0:00 /usr/libexec/gvfsd
saml      2178     1  0 Jul25 ?        Ssl    0:01 /usr/bin/pulseaudio --start --log-target=syslog
saml      2180     1  0 Jul25 ?        Ssl    0:04 /usr/libexec//gvfs-fuse-daemon /home/saml/.gvfs
saml      2191     1  0 Jul25 ?        S      0:12 syndaemon -i 0.5 -k
saml      2193     1  0 Jul25 ?        S      0:00 /usr/libexec/gvfs-gdu-volume-monitor

2

pskhông có bộ lọc rất linh hoạt. Làm cho nó hiển thị nhiều hơn những gì bạn cần, xác định rõ định dạng và lọc đầu ra. Awk thường sẽ làm việc tốt cho nhiệm vụ này.

ps -o pid= -o ppid= -o user= -o comm= -o args= |
awk -v uid="$(id -un myuser)" '$2 == 1 && $3 == uid'

Các dấu bằng sau tên cột triệt tiêu dòng tiêu đề. Nếu bạn muốn xem các dòng tiêu đề, hãy làm cho bộ lọc in ra dòng đầu tiên không thay đổi:

ps -o pid -o ppid -o user -o comm -o args |
awk -v uid="$(id -un myuser)" 'NR == 1 || ($2 == 1 && $3 == uid)'

Nếu bạn muốn thực hiện một số xử lý tự động, bạn sẽ chỉ cần tách dữ liệu xuống các PID.

ps -o pid= -o ppid= -o user= |
awk -v uid="$(id -un myuser)" '$2 == 1 && $3 == uid {print $1}'

0

Tôi đã phải kiểm tra PID bắt đầu theo đợt của mình, vì vậy tôi phải kiểm tra PID và PPID, grep này hữu ích hơn với tôi:

grep -c $$ /proc/CHILDPID/stat
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.