Filter by process name and log CPU usage

LinuxUnix

Linux Problem Overview


Is there an option for linux top command where i can filter processes by name and write the CPU usage of that process every 1 second to a log file?

Linux Solutions


Solution 1 - Linux

top & pgrep

To filter the output of top by process name, you can use pgrep to get a list of PIDs by process name then pass them to the -p option of top.

For example:

top -p $(pgrep -d',' http)

Note: the -d',' option delimits the PIDs with commas, which is what is expected by the top -p. Note 2: top will return a failure message if there are no running processes that match the name you specify in pgrep.

To write the results of top to a file, use the -n 1 option (only one iteration) and redirect the output to your log file.

top -p $(pgrep -d',' http) -n 1 >> your_log_file

To do that every second, perhaps a while loop with a sleep would do?

while :; do top -p $(pgrep -d',' http) -n 1 >> your_log_file; sleep 1; done

To timestamp each entry, you can append the output of date. E.g.

while :; do top -p $(pgrep -d',' http) -n 1 >> log.txt; date >> log.txt; sleep 1; done

Solution 2 - Linux

Another option is:

top -b -d 1 -p $(pgrep -d',' java) -n 120 > log.txt
  • The option -d allows to set the frequency used by top to refresh the data.
  • The option -b means that the traditional interface of top is not used. Instead, it sends everything to the standard output and then you can use a pipe (|) or a redirection (>).
  • The option -n informs about the number of iterations top should execute.

After that you can type:

cat log.txt | grep USER_OF_PROCESS

You will see the execution time of the process and also %CPU, Memory and all that.

Solution 3 - Linux

#You can run following script as ./cpurecorder.sh pid filename
#It will generate output file with memory usage and cpu utilisation.
#You can log other variable by searching man for ps.

`enter code here`filepath=/home/rtcsadm              # modify as desired
interval=20                         # reports per minute
timelimit=6000                      # how long to run, in seconds

mydate=`date "+%H:%M:%S"`           # the timestamp
freq=$((60/$interval))              # for sleep function

while [ "$SECONDS" -le "$timelimit" ] ; do
  ps -p$1 -opid -opcpu -opmem -ocomm -c | grep $1 | sed "s/^/$mydate /" >> $filepath/$2.txt
  sleep 3
  mydate=`date "+%H:%M:%S"`
done

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBalaBView Question on Stackoverflow
Solution 1 - LinuxShawn ChinView Answer on Stackoverflow
Solution 2 - LinuxInti Gonzalez-HerreraView Answer on Stackoverflow
Solution 3 - Linuxuser3193783View Answer on Stackoverflow