ps는 Linux에서 비 커널 프로세스 만 표시 할 수 있습니까?


답변:


37

이 작업은 Linux에서 수행해야합니다.

ps --ppid 2 -p 2 --deselect

kthreadd(PID 2)에는 PPID 0 ( Linux 2.6 이상 )이 있지만 psPPID 0을 필터링 할 수 없습니다. 따라서이 해결 방법입니다.


멋지지만 kthreadd항상 PID 2 라는 것이 얼마나 보장 됩니까?
l0b0 2016 년

@ l0b0 모르겠다 :-) 두 단계 로이 작업을 수행 할 수 있습니다.의 PID를 결정한 kthreadd다음 해당 ps호출을 작성하십시오. 이 "항상"이 "kthreadd"라는 것이 얼마나 보장됩니까? 안전한 솔루션은 더 복잡하고 ps정상적으로 실행 되고 출력을 구문 분석하고 일부 테스트를 수행합니다.
Hauke ​​Laging 2016 년

2
x86 arch의 Linux 2.4에서는 적어도 그 프로세스에 ppid 1이 있으므로 그렇게 구별 할 수 없었습니다.
Stéphane Chazelas 2016 년

1
"ps -ef"처럼 "ps --ppid 2 -p 2 --deselect -f"를 수행하고 "ps aux"처럼 "ps --ppid 2 -p 2 --deselect u"를 수행하십시오
Peter

1
@Totor 확인하고 x이것이 작동하지 않는 것처럼 보입니다 . ps au --ppid 2 -p 2 --deselect작동합니다.
Sankalp

9

커널 프로세스를 인식하는 한 가지 방법은 사용자 메모리를 사용하지 않는 것이므로 vsz 필드는 0입니다.이 또한 좀비 ( 이 관측치에 대한 Stephane Chazelas 덕분에)를 잡습니다 . 상태에 따라 제거 할 수 있습니다.

ps axl | awk '$7 != 0 && $10 !~ "Z"'

PID 만 나열하려면 다음을 수행하십시오.

ps -e -o pid= -o state= -o vsize= | awk '$2 != "Z" && $3 != 0 {print $1}'

내 솔루션과 마찬가지로 좀비 프로세스도 포함됩니다.
Stéphane Chazelas 2016 년

1
@StephaneChazelas 좋은 점, 필터에 조건을 추가했습니다.
Gilles 'SO- 악마 그만해'

9

실제로 나는 다음 관용구를 충분히 발견했다.

ps auxf | grep -v ]$

대괄호로 끝나는 줄을 필터링하여 원치 않는 항목을 생략 할 있지만 가능성은 거의 없습니다. 그 대가로 기억하기 쉽고 비교적 타이핑하기가 쉽습니다.

avahi-daemon과 같은 일부 프로세스는 프로세스 이름 정보를 대괄호로 묶고 (avahi-daemon의 경우 호스트 이름)이 명령에 의해 필터링됩니다.


8

이러한 프로세스의 특수성 중 하나는 실행 파일에 의해 지원되지 않으므로 ( zsh에서 ) 다음을 수행 할 수 있습니다 .

ps /proc/[0-9]*/exe(^-@:h:t)

또는 POSIX 쉘에서 :

ps -p "$(find -L /proc/[0-9]*/exe ! -type l | cut -d / -f3 | paste -sd , -)"

/proc/<pid>/exe파일에 대한 링크 인 프로세스를 확인 합니다.

그러나 이는 /proc/<pid>/exe심볼릭 링크 의 상태를 확인하려면 수퍼 유저 여야합니다 .

편집 : 좀비 프로세스가 발생하면 (적어도) 동일한 조건을 충족하므로 제외하지 않으려면 다시 추가해야합니다. 처럼:

ps -p "$(
  { find -L /proc/[0-9]*/exe ! -type l | cut -d / -f3
    ps -Ao pid=,state= | sed -n 's/ Z//p'
  } | paste -sd , -)"

참고 ps -f쇼를 대괄호 안에 그 프로세스 이름을 때문이 아니라 그들이있는 거 커널 프로세스,하지만 그들은 빈 있기 때문에 argv[](대신 PS 쇼 때문에 프로세스 이름 argv[0]이 참조). 빈 공간을 가진 사용자 공간 프로세스를 argv[]가질 수 있으며 프로세스 이름을 가진 argv[0]형식을 가질 수 [some-string]있으므로 ps대괄호를 기반으로 출력을 필터링하는 것은 완벽한 옵션이 아닙니다.


이것은 비표준 쉘 구문입니다.
Totor

1
말했듯 @Totor, 첫 번째는 zsh구. 두 번째는 표준 POSIX sh(및 psand findcutand paste) 구문입니다. 물론 /procPOSIX에 의해 지정되지 않았습니다.
Stéphane Chazelas

이 답변은 보편적 이므로 편집에 감사드립니다. 그러나 Hauke ​​Laging 의 답변은 2.4 커널을 다루지 않는 한 아주 훌륭하고 간단합니다.
Totor

@Totor, Hauke의 답변은 수퍼 유저 권한이 필요 없다는 장점도 있습니다. 내 대답은 2.4 및 2.6 / 3 커널에서 작동하지만 어쨌든 4.x에서 작동한다고 보장하지는 않습니다.
Stéphane Chazelas 2016 년

흠, 당신 말이 맞아요, 나는 루트 특권에 대해 생각하지 않았습니다. 루트 없을 때 당신은 여전히 답을 얻을 수 있기 때문에 그것은 실수로 이어질 수 있지만, 그건 다른 (예를 들어,로 계산 할 때주의해야하므로 wc -l). 글쎄, 나는 Hauke ​​Laging 의 대답을 받아들이고 당신에게 공감대를 줄 것이다. ;)
Totor

1

ps출력을 구문 분석하고 대괄호 안에없는 프로세스 이름을 찾을 수도 있습니다.

ps aux | awk '$NF!~/^\[.+\]$/'

당신이 관심있는 사용자 목록을 얻는 약간 덜 신뢰할 수있는 방법 : awk -F: '$7 ~ home { print $1 }' /etc/passwd-당신은 여전히 그러한 사용자 이름 을 언급 하는 프로세스를 얻을 수 있으며 임시 파일은 그대로 둡니다. 나는 downvote를 철회 할 것이지만, 당신의 세 번째 해결책이 합리적이기 때문입니다.
Keith Thompson

@KeithThompson은 다른 모든 것을 제거했습니다. 가치가 없습니다. 쓸모없는 주석을 정리하는 데 도움이 될 수 있습니까?
terdon

2
참고 $NF명령 행의 마지막 단어입니다 ps aux출력. 커널이 아닌 프로세스가 [...]있을 수 있습니다 . 내 대답에서 말했듯이 [xxx]표기법은 커널 프로세스이기 때문에가 아니라 커널이 아닌 프로세스에서도 허용되는 명령 줄 (인수 없음)이 없기 때문입니다.
Stéphane Chazelas

1

busybox에서 ps크게 단순화되고 출력이 다른 곳에서 이것을 시도하는 사람에게는이 Gilles의 훌륭한 답변이 잘 작동합니다.

ps -o pid,user,comm,vsz,stat | awk '$4 != 0 && $5 !~ "Z"'

Gilles의 답변에 따르면, 여기서 방법론은 사용자 메모리를 사용하지 않는 프로세스 (`vsz col == 0)를 찾고 좀비 프로세스를 필터링합니다 (상태 col은 'Z'가 아닙니다).

1 기반 awk 필드 번호가 그에 따라 조정되는 한 출력 열을 쉽게 조정할 수 있습니다. 가짜 값을 입력하여 ps가 사용할 수있는 옵션을 확인하면 알려줍니다. 예를 들면 다음과 같습니다.

$ ps -o foo
ps: bad -o argument 'foo', supported arguments: user,group,comm,args,pid,ppid,pgid,tty,vsz,stat,rss

0

개수 만 필요하다면 ... 커널 대 사용자 프로세스를 필터링 해야하는 비슷한 필요가 있었지만 각각의 개수 만 필요했습니다. 이것은 내 해결책이었습니다.

ps -eo vsize | awk '{p[$1==0]++} END {printf "%-16s %6d\n%-16s %6d\n%-16s %6d\n", "Kernel processes", p[1], "User processes", p[0], "Total processes", p[0]+p[1]}'

샘플 출력 :

Kernel processes    353
User processes       52
Total processes     405

설명 : VSZ = 0 프로세스가 커널 프로세스라고 가정 할 수있는 핵을 사용하고 있습니다. 따라서 awk, 나는 VSZ (from ps -eo vsize)가 0인지 여부 에 대한 비교를 평가 합니다. 비교 결과는 부울 0 또는 1입니다. 나는 배열을 만들고 p[]프로세스 목록을 아래로 내려갈 때 커널 프로세스 인 경우 증가 p[1]++합니다. 그렇지 않으면 사용자 프로세스로을 증가시킵니다 p[0]++. 모든 증분 후, END { }블록 에서 p [0] 및 p [1]의 값 (예 : 카운트)에 레이블을 지정하고 인쇄합니다 .


0

당신이 내 친구를 찾고 있습니다 무엇 아니다 ps, 그러나 pstree.

먼저 첫 번째 커널 프로세스를 식별하십시오. PID는 일반적으로 시스템이없는 시스템에서 1이고 시스템이있는 2입니다.

그런 다음이 명령을 사용하십시오.

$ pstree -p <1 or 2> | grep -o '([0-9]\+)' | grep -o '[0-9]\+'

선택한 답변 (✅이있는 답변)은 다른 명령을 사용하고 있습니다.

$ ps --ppid 2 -p 2 --deselect

ps명령 의 문제점 은 직계 자식 만 포함하고 모든 자손은 포함하지 않는다는 것입니다. 이 pstree명령에는 모든 자손이 포함됩니다. 이 두 명령 (쉬운 방법은 | wc)을 사용하여 결과를 비교하고 계산하여 확인할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.