프로세스의 CPU 로드 추적

프로세스의 CPU 로드 추적

foo터미널에서 실행하고 싶은 프로세스가 있습니다 . 동시에 프로세스가 소비하는 CPU 양을 확인하는 데 관심이 있으므로 로 이동하여 열에서 top프로세스 foo(이 이름을 가진 프로세스는 하나만 있음)를 %CPU찾아 해당 값을 날짜/시간 스탬프가 포함된 파일을 추출하고 값을 한 줄에 배치합니다. 이러한 값을 사용하여 워크로드를 더 잘 이해하기 위한 그래프와 일부 설명 통계를 생성할 수 있습니다 foo.

또한 이 CPU 로드 추출이 매초마다 n(예: 매초 ) 계속되기를 원하며, 시작될 때 시작되고 처리가 완료되면 끝나기를 n=1원합니다 .foofoo

내가 이해한 바로는 이를 위해서는 두 프로세스가 동시에 발생해야 합니다.

이를 달성하는 방법에 대한 아이디어가 있습니까? 필요한 경우 최후의 수단으로 쉘 스크립트를 터미널에 직접 명령으로 제공하는 것이 가장 좋습니다.

편집하다:아래 댓글의 링크는 값을 검색하는 방법에 대한 답변입니다 top. 그러나 "기본" 프로세스와 추적 프로세스라는 두 프로세스의 실행을 시뮬레이션하는 방법을 파악해야 합니다. 추적 프로세스는 기본 프로세스가 시작되고 끝날 때 각각 시작되고 종료됩니다.

답변1

주요 부분은 링크 달린 댓글로 답변해드리기 때문에질문

나는 당신의 질문의 나머지 부분에 대답하려고 노력할 것입니다.

"기본" 프로세스를 어떻게 실행하는지 모르기 때문에 래퍼 스크립트 컨텍스트와 시스템 컨텍스트에서 이에 대해 다루겠습니다.

하지만 그 전에 오해를 풀고 싶습니다.

실제로 이러한 프로세스를 실행할 수는 없습니다.동시에, 기본 프로세스가 시작될 때까지 기다리거나(이전에 감시자를 시작한 경우) 나중에 감시자를 시작해야 합니다. 이렇게 하면 감시자가 기본 프로세스가 이미 실행 중이라고 가정할 수 있습니다.

체계:

프로세스가 systemd에 의해 관리되는 경우 해당 장치에 대한 서비스 파일이 있을 가능성이 높습니다.

이러한 파일은 일반적으로 배포판에 저장되거나 /etc/systemd/system/배포판 /usr/lib/systemd/system/에 따라 달라집니다.

이러한 파일을 조작하는 가장 쉬운 방법은 다음 구문을 사용하는 것입니다.

systemctl edit <service name> --full

지정하면 --full직접 편집(기본적으로 블라인드 편집)을 수행하는 대신 원본 파일의 복사본을 수정할 수 있으며, 이 특정 서비스를 처음 사용하는 경우 유용할 수 있습니다.

실제 수정해야 할 사항은 ExecStartPre=또는 ExecStartPost=ExecStopPost=

ExecStartPre지정된 작업을 수행합니다(관찰자 스크립트/프로그램 실행).앞으로서비스가 시작되었습니다

ExecStartPost지정된 작업을 수행합니다(관찰자 스크립트/프로그램 실행).뒤쪽에서비스가 시작되었습니다시동이 성공한 경우에만

마찬가지로 ExecStopPost지정된 작업이 수행됩니다.뒤쪽에서비스가 종료되었습니다( 에 정의된 작업이 완료됨 ExecStop).

아래는 예입니다:

[Unit]
Description=Foo

[Service]
# Start the watcher
ExecStartPre=/usr/bin/foo-watcher
# Actual service start
ExecStart=/usr/sbin/foo-daemon start
# Actual service stop
ExecStop=/usr/sbin/foo-daemon stop
# Stop the watcher
ExecStopPost=/usr/bin/pkill foo-watcher

[Install]
WantedBy=multi-user.target

ExecStopPost이름보다는 PID로 프로세스를 종료하는 것이 더 나을 수 있지만 이를 수행하지 않는 제품의 예가 많기 때문에 동일한 이름을 가진 프로세스를 실수로 종료할 위험이 있다는 점에 유의하세요 .

서비스 파일 지시어에 대한 추가 정보

스크립트 방법 시작:

기본적으로 시작 bash 스크립트에서 프로세스를 래핑해야 하며 이 스크립트를 사용하여 여러 프로세스를 관리하려면 감시자와 기본 프로세스를 백그라운드에 두는 것이 유용할 수 있습니다.

완전한 기능을 갖춘 관리 스크립트로 만들 계획이라면 이러한 백그라운드 프로세스의 PID도 추적해야 합니다.

간단한 예는 다음과 같습니다.

#!/bin/bash

# Do we have too many arguments(Or too few)? Exit if so.
if [ $# -ne 1 ]
then
        exit 1
fi

if [ "$1" == "start" ]
then
        # Start the watcher as a job and save the pid to a variable
        /usr/bin/foo-watcher &
        wPid="$!"
        
        # Start the main process as a job and save the pid to a variable
        /usr/bin/foo-daemon &
        mPid="$!"
        
        # Save the PIDs to a file, make sure than the main process
        # (foo-daemon) doesn't already do this for us
        /usr/bin/echo "$wPid" > /var/run/foo-watcher.pid
        /usr/bin/echo "$mPid" > /var/run/foo-daemon.pid
elif [ "$1" == "stop" ]
then
        # Grab PID from files and store in a variable, since kill
        # doesn't read from stdin
        wPid="$(/usr/bin/cat /var/run/foo-watcher.pid)"
        mPid="$(/usr/bin/cat /var/run/foo-daemon.pid)"
        
        # Kill the processes
        /usr/bin/kill "$wPid"
        /usr/bin/kill "$mPid"
        
        # Delete pid files
        /usr/bin/rm -f /var/run/foo-watcher.pid
        /usr/bin/rm -f /var/run/foo-daemon.pid
else 
        # We didn't get a valid input, exit (maybe display help?)
        exit 1
fi

기본 프로세스의 종료를 제어할 수 없는 경우( dd해당 프로세스 또는 rm유사한 프로세스가 작업을 수행하고 종료되는 경우) 다음은 이 상황을 처리하기 위해 위 스크립트를 수정한 것입니다.

#!/bin/bash

# Start the watcher as a job and save the pid to a variable
/usr/bin/foo-watcher &
wPid="$!"

# Start the main process as a job and save the pid to a variable
/usr/bin/foo-daemon &
mPid="$!"

while true
do
        #Check ps for the process via PID
        status="$(ps -q "$mPid" | wc -l)"
        #Did ps return anything, if not, kill the watcher
        if [ "$status" -eq 1 ]
        then
                kill "$wPid"
                exit 0
        fi
        #Interval to check if process is running in seconds
        sleep 1 
done

관련 정보