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

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

프로세스 이름과 nice 번호만으로 PID 번호를 찾는 스크립트를 작성하려고 하는데 찾을 수 없습니다.

답변1

를 사용하여 pgrep먼저 첫 번째 인수로 제공된 표현식과 일치하는 모든 프로세스의 PID를 얻은 다음 이를 반복하여 두 번째 인수에 해당하는 좋은 값을 가진 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훌륭함에 상관없이 이름이 로 시작하는 모든 프로세스를 찾습니다 .

위의 방법을 사용하여 이름에 개행 문자와 바이너리 쓰레기가 포함된 프로세스를 얻으려면 좀 더 복잡한 것이 필요할 수 있습니다.

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에서는 psawk:

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
      }'
}

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

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

구현procps-ngps-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}'
}

관련 정보