"ps"에서 여러 기준으로 선택하는 방법이 있나요?

"ps"에서 여러 기준으로 선택하는 방법이 있나요?

매우 분명한 것이 빠진 것 같지만 여전히 다음과 같습니다.

ps -f -u myuser --ppid 1

프로세스의 상위 pid만 보고 사용자가 1이 아니더라도 상위 pid가 1인 모든 프로세스를 반환하는 것 같습니다 myuser.

단독으로 잘 작동합니다 -u(선택한 프로세스만 해당 myuser):

ps -f -u myuser

내가 무엇을 놓치고 있나요? 여러 기준으로 필터링할 수 있는 기본 제공 방법이 있나요 ps?

편집하다: 내 현재 해결 방법:

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

답변1

ps그거 짜증나네. 다행스럽게도 pgrep비슷한 선택 옵션이 있지만 모두 일치해야 하고 일치하는 pid를 출력하는 이 있습니다. 기본적으로 한 줄에 하나씩 출력되지만 사용할 수 있도록 다른 구분 기호를 요청할 수 있습니다 ps.

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

답변2

불행하게도 선택 취소만 있을 뿐, 연산자나 개선 기능을 추가하는 기능은 ps없는 것 같습니다 .and

pgrepPID 목록을 얻고 이를 제공하기 위해 도움을 요청할 수 있습니다 ps. 예를 들어:

$ 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

답변3

ps매우 유연한 필터는 없습니다. 필요한 것보다 더 많이 표시하고, 형식을 명시적으로 지정하고, 출력을 필터링하세요. awk는 보통 이런 일을 잘해요.

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

열 이름 뒤의 등호는 머리글 행을 억제합니다. 헤더 행을 보려면 필터가 변경되지 않은 첫 번째 행을 인쇄하도록 합니다.

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

일부 자동화를 수행하려면 데이터를 PID로만 줄여야 합니다.

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

답변4

배치 시작의 PID를 확인해야 하므로 PID와 PPID도 확인해야 합니다. 이 grep이 저에게 더 유용합니다.

grep -c $$ /proc/CHILDPID/stat

관련 정보