시스템의 모든 프로세스에 대한 정보를 얻고 싶습니다.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
.
이 방법은 제외됩니다.이것 ps
ps
다른 프로세스(있는 경우)는 해당되지 않습니다 .
답변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로 출력의 실제 필드를 변경합니다.)ps
ps
zsh에서는 sh
다음을 수행하여 실행을 피할 수 있습니다.
zmodload zsh/system
print_pid_and_run() (echo $sysparams[pid] && exec "$@")
배쉬에서:
print_pid_and_run() (echo "$BASHPID" && exec "$@")
( bash
위의 내용과 반대로 zsh
in은 내장 기능이나 기능을 실행하는 데 사용할 수 없다는 점을 기억하세요).
답변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 1h
ps
아직 실행 중이고 지난 3초 동안 가장 많은 CPU 시간을 사용한 프로세스를 얻으려면 한 지점에서 모든 프로세스의 CPU 시간을 수집한 다음 3초 후에 다시 수집하고 다음을 수행해야 합니다. ps -o pcpu
이를 사용할 수 없거나 top
배치 모드에서 유사한 응용 프로그램을 사용하여 계산을 수행할 수 있습니다.