
프로세스 이름과 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 0
bash
niceness = 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에서는 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
}'
}
이는 niceness 열과 프로세스 이름 사이에 단일 공백 문자가 있다고 가정합니다. 이는 일반적으로 Linux 기반 시스템에서 발견되는 procps-ng 구현의 경우이지만 POSIX에서는 보장되지 않습니다. 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}'
}