ps 출력에서 ​​ps 자체를 제외합니다.

ps 출력에서 ​​ps 자체를 제외합니다.

시스템의 모든 프로세스에 대한 정보를 얻고 싶습니다.ps프로세스 제외그 자체.

즉, 다음과 같습니다.

ps --no-headers --pid 1111 -N

어디1111프로세스 ID입니다지금ps명령을 실행하십시오 .

나는 다음과 같은 것을 시도했습니다

ps --no-headers --ppid $$ -N

그러나 이는아니요ps다음과 같은 "하위 프로세스"에서 실행되는 경우 :

IFS=' ' read pctd proc <<<$(/bin/ps --no-headers --ppid $$ -No pcpu,pid,comm --sort=+pcpu | tail -n 1)

마지막 명령은 CPU 사용량 비율, 프로세스 ID 및 "최근" 가장 많은 CPU를 사용한 프로세스 이름을 가져오려고 시도합니다.

IFS=' ' read pctd proc <<<$(/bin/ps --no-headers -eo pcpu,pid,comm --sort=+pcpu | tail -1)

최근까지 잘 작동했습니다. 하지만,Ubuntu 23.04(또는 커널 6.x)로 업데이트한 후 ps시작때때로CPU를 100% 사용하고 있다고 표시하세요..


현재 다음은 해결 방법인 것 같습니다(그러나 안전하지는 않음).

IFS=' ' read pctd proc <<<$(/bin/ps --no-headers -eo pcpu,pid,comm --sort=+pcpu | grep -v \ ps | tail -1)

답변1

ps본인 제외 :

sh -c 'exec ps --no-headers --pid "$$" -N'

sh자체 PID를 로 바꾼 $$다음 자신을 로 바꿉니다 ps. PID는 변경되지 않습니다. 이것이 exec작동하는 방식입니다. 이 메소드는 ps자신의 PID를 옵션 매개변수로 받습니다 --pid.

이 방법은 제외됩니다.이것 psps다른 프로세스(있는 경우)는 해당되지 않습니다 .

답변2

일반화로서ps자신의 항목을 제거하는 방법특히 ps비표준 -N/ --deselect옵션을 지원하지 않는 구현의 경우 일반적인 접근 방식은 다음과 같습니다.

print_pid_and_run() {
  sh -c 'echo "$$" && exec "$@"' sh
}
print_pid_and_run ps ...ps-options... |
  awk 'NR == 1 {pid = $0; next}
       $1 != pid'

( 전달된 옵션을 기반으로 $1프로세스 pid로 출력의 실제 필드를 변경합니다.)psps

zsh에서는 sh다음을 수행하여 실행을 피할 수 있습니다.

zmodload zsh/system
print_pid_and_run() (echo $sysparams[pid] && exec "$@")

배쉬에서:

print_pid_and_run() (echo "$BASHPID" && exec "$@")

( bash위의 내용과 반대로 zshin은 내장 기능이나 기능을 실행하는 데 사용할 수 없다는 점을 기억하세요).

답변3

귀하의 질문에 대한 답변이 아니라 의견입니다.

IFS=' ' read pctd proc <<<$(/bin/ps --no-headers --ppid $$ -No pcpu,pid,comm --sort=+pcpu | tail -n 1)

마지막 명령은 CPU 사용량 비율, 프로세스 ID 및 "최근" 가장 많은 CPU를 사용한 프로세스 이름을 가져오려고 시도합니다.

나는 당신의 접근 방식이 잘못되었습니다. pcpu프로세스가 존재한 이후 총 시간에 대한 프로세스의 스레드를 실행하는 CPU에 소요된 시간의 비율을 반환합니다.

예를 들어, 프로세스가 시작되고 마치 명령을 실행하는 것처럼 자체적으로 초기화하는 데 몇 밀리초가 걸린 다음(이 동안 1밀리초 동안 거의 100% CPU를 사용할 수 있음) 10시간 동안 절전 모드로 전환한 다음 20개의 스레드를 생성하고 20개의 스레드를 최대한 활용합니다. CPU는 1분 동안 지속됩니다. top예를 들어 이 시간 동안 CPU 사용량은 2000%로 표시됩니다. 지금 실행하면 ps -o pcpu프로세스는 총 601분 중 20분의 CPU를 사용하므로 2000% 대신 약 3%가 표시됩니다. 반면, ps명령이 시작될 때 명령을 실행하면 프로세스가 1밀리초 이상의 CPU 시간을 사용하고 100% CPU 사용률을 보고하는 것을 볼 수 있습니다.sleep 1hps

아직 실행 중이고 지난 3초 동안 가장 많은 CPU 시간을 사용한 프로세스를 얻으려면 한 지점에서 모든 프로세스의 CPU 시간을 수집한 다음 3초 후에 다시 수집하고 다음을 수행해야 합니다. ps -o pcpu이를 사용할 수 없거나 top배치 모드에서 유사한 응용 프로그램을 사용하여 계산을 수행할 수 있습니다.

답변4

이렇게 사용하세요필터 폐기 ps:

$ read pctd pid proc < <(
    ps --no-headers -eo pcpu,pid,comm |
        awk '$1>=max && $3!="ps"{max=$1; val=$0}END{print val}'
)

$ echo $pctd 
11.1
$ echo $pid
1234
$ echo $proc 
process-name

더 안정적인 방법, 사용하는 것입니다 top:

top -b -n1 | awk '/ PID /{p=1;next} p && !/top/{print $9, $12;exit}'

관련 정보