답변:
이 작업은 Linux에서 수행해야합니다.
ps --ppid 2 -p 2 --deselect
kthreadd
(PID 2)에는 PPID 0 ( Linux 2.6 이상 )이 있지만 ps
PPID 0을 필터링 할 수 없습니다. 따라서이 해결 방법입니다.
kthreadd
다음 해당 ps
호출을 작성하십시오. 이 "항상"이 "kthreadd"라는 것이 얼마나 보장됩니까? 안전한 솔루션은 더 복잡하고 ps
정상적으로 실행 되고 출력을 구문 분석하고 일부 테스트를 수행합니다.
x
이것이 작동하지 않는 것처럼 보입니다 . ps au --ppid 2 -p 2 --deselect
작동합니다.
커널 프로세스를 인식하는 한 가지 방법은 사용자 메모리를 사용하지 않는 것이므로 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}'
이러한 프로세스의 특수성 중 하나는 실행 파일에 의해 지원되지 않으므로 ( 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
대괄호를 기반으로 출력을 필터링하는 것은 완벽한 옵션이 아닙니다.
zsh
구. 두 번째는 표준 POSIX sh
(및 ps
and find
및 cut
and paste
) 구문입니다. 물론 /proc
POSIX에 의해 지정되지 않았습니다.
wc -l
). 글쎄, 나는 Hauke Laging 의 대답을 받아들이고 당신에게 공감대를 줄 것이다. ;)
ps
출력을 구문 분석하고 대괄호 안에없는 프로세스 이름을 찾을 수도 있습니다.
ps aux | awk '$NF!~/^\[.+\]$/'
awk -F: '$7 ~ home { print $1 }' /etc/passwd
-당신은 여전히 그러한 사용자 이름 을 언급 하는 프로세스를 얻을 수 있으며 임시 파일은 그대로 둡니다. 나는 downvote를 철회 할 것이지만, 당신의 세 번째 해결책이 합리적이기 때문입니다.
$NF
명령 행의 마지막 단어입니다 ps aux
출력. 커널이 아닌 프로세스가 [...]
있을 수 있습니다 . 내 대답에서 말했듯이 [xxx]
표기법은 커널 프로세스이기 때문에가 아니라 커널이 아닌 프로세스에서도 허용되는 명령 줄 (인수 없음)이 없기 때문입니다.
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
개수 만 필요하다면 ... 커널 대 사용자 프로세스를 필터링 해야하는 비슷한 필요가 있었지만 각각의 개수 만 필요했습니다. 이것은 내 해결책이었습니다.
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]의 값 (예 : 카운트)에 레이블을 지정하고 인쇄합니다 .
당신이 내 친구를 찾고 있습니다 무엇 아니다 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
)을 사용하여 결과를 비교하고 계산하여 확인할 수 있습니다.
kthreadd
항상 PID 2 라는 것이 얼마나 보장 됩니까?