이름과 번호로 프로세스 필터링

이름과 번호로 프로세스 필터링

프로세스 이름과 좋은 번호만 포함된 PID 번호를 찾는 스크립트를 작성하려고 하는데 안되네요.

답변1

pgrep먼저 첫 번째 인수로 제공된 표현식과 일치하는 모든 프로세스의 PID를 가져온 다음 이러한 프로세스를 반복하여 두 번째 인수에 해당하는 좋은 값을 가진 프로세스를 추출하는 데 사용됩니다 .

find_pid_by_name_and_nice () {
    pgrep -- "${1:?missing process name}" |
    xargs -I {} ps -o pid= -o nice= -p {} |
    awk -v nice="${2?missing nice value}" '$NF == nice { print $1 }'
}

시험:

$ find_pid_by_name_and_nice
find_pid_by_name_and_nice:1: 1: missing process name
find_pid_by_name_and_nice:3: 2: missing nice value
$ find_pid_by_name_and_nice netdata
find_pid_by_name_and_nice:3: 2: missing nice value
$ find_pid_by_name_and_nice netdata 19
258881
258937
$ find_pid_by_name_and_nice netdata 15

(출력 없음)

답변2

by_name_and_nice(){ grep -hoPs "^[^ ]+(?= \($1\)( [^ )]+){16} $2 )" /proc/*/stat; }

by_name_and_nice bash 0bashniceness = 0(기본값)인 모든 프로세스를 찾습니다 .

by_name_and_nice 'b.*' '.*'b이름이 a로 시작하는 모든 프로세스 는 좋은지 나쁜지 등에 관계없이 검색됩니다 .

이름에 줄바꿈 및 바이너리 쓰레기가 포함된 프로세스도 얻으려면 좀 더 복잡한 것을 원할 수 있습니다.

by_name_and_nice(){
    local -; set -o pipefail
    LC_ALL=C grep -zhoPs "^[^ ]+(?= \($1\)( [^ )]+){16} $2 )" /proc/*/stat | xargs -0rn1
}

프로세스 이름에서 개행 문자를 일치시키려면 사용해야 합니다 by_name_and_nice '(?s:foo.*)' 0(자세한 내용은PCRE 정규식 구문GNU grep -P옵션에서 사용됨).


이는 설명 목적으로만 사용되며 연산자보다 크거나 작지 않은 상태에서 적절한 값으로 선택하는 것은 의미가 없습니다. 또한 프로세스 이름을 기준 으로 선택하는 것은 프로세스 이름이 프로세스의 완전한 제어 하에 있고 2비트 악성 코드 및 스팸이 프로세스 이름을 끊임없이 남용하여 자신을 호출할지 ps여부를 결정하기 때문에 신뢰성이 매우 낮습니다. bash아래와 같이 기본 이름을 선택합니다.

find /proc/*/exe -lname '*/whatever'

나머지는 모두 독자를 위한 연습으로 개발하세요 ;-)

답변3

POSIXly에서는 다음을 사용 ps하세요 awk.

by_name_and_nice() {
  # returns pids of processes with $2 as niceness and whose
  # process name matches the $1 extended regexp
  ps -A -o pid= -o nice= -o comm= |
    NAME=$1 NICE=$2 awk '
      $2 == ENVIRON["NICE"] {
        pid = $1
        sub(/^[[:space:]]*[^[:space:]]+ +[^[:space:]]+ /, "")
        if ($0 ~ ENVIRON["NAME"]) print pid
      }'
}

친숙한 열과 프로세스 이름 사이에 공백 문자가 있다고 가정합니다. 이는 일반적으로 Linux 기반 시스템에서 발견되지만 POSIX에서는 보장되지 않는 procps-ng 구현의 경우입니다. Niceness 열 뒤의 공백 문자를 모두 제거할 수 있지만 이렇게 하면 이름이 공백으로 시작하는 프로세스를 잘못 나타낼 위험이 있습니다.

procps-ng는 출력에서 ps​​최소한 ?인쇄할 수 없는 문자를 인쇄할 수 없는 문자로 변경하고 인쇄할 수 없는 문자의 구성은 호출자의 로케일에 따라 달라집니다 ps. 예를 들어 UTF-8이라는 프로세스는 로케일이 UTF-8과 다른 문자 집합을 사용하는 Stéphane것처럼 나타날 수 있습니다 .St??phane

procps-ng구현에서는 이름별로 프로세스를 일치시키는 옵션을 ps지원 합니다 -C(HP/UX의 에서 영감을 얻음 ps). 이는 정규식 일치가 아닌 정확한 바이트 대 바이트 동일 일치이므로 다음과 같이 수행할 수 있습니다.

by_name_and_nice() {
  # returns pids of processes with $2 as niceness and whose
  # process name is exactly $1
  ps -C "$1" -o pid= -o nice= |
    awk -v nice="$2" '$2 == nice {print $1}'
}

관련 정보