-1

I'm hoping to be able to collect system CPU information using sar and want to have one file where it contains all the data collected and a second file which only stores the last entry.

Output below would be my measurements.txt file

14:54:45        CPU     %user     %nice   %system   %iowait    %steal     %idle
14:54:48        all      6.12      0.00     35.03      2.72      0.00     56.12
14:54:51        all      6.23      0.00     34.60      0.00      0.00     59.17
14:54:54        all      9.69      0.00     47.75      0.35      0.00     42.21
14:54:57        all      5.23      0.00     31.71      1.39      0.00     61.67
14:55:00        all      7.14      0.36     33.21      0.00      0.00     59.29
14:55:03        all      6.23      0.00     32.53      1.04      0.00     60.21
14:55:06        all      7.89      0.00     30.82      0.00      0.00     61.29
14:55:09        all      8.51      0.00     31.91      3.55      0.00     56.03

The last entry starting at 14:55:09 would be the only entry in my last_entry.txt file.

However any time I've tried to do this, I've been unable to get the last entry from the sar command in my last_entry.txt file. I've been able to send the sar output to measurements.txt file as shown in the example, however it's the last part I'm really struggling with.

At one stage, I managed to get one output to the last_entry.txt file however it wasn't the last entry, so I'm guessing that perhaps that part of my script only gets carried out once. Problem is, I don't know how to get it to continuously get the last entry until I cancel it.

Here's my code for the script which sends the output of sar to a text file and then sends the first entry instead of the last entry to the second file.

sar -u 3 > measurements.txt & tail -1 measurements.txt  > last_measurement.txt
Mark O'Sullivan
  • 10,138
  • 6
  • 39
  • 60

1 Answers1

1

The problem is with the & command separator. It causes the sar command to run in the background while you fetch the current last line of its output file at some indeterminate time during its execution. You want sar to finish, then run tail.

sar -u 3 > measurements.txt ; tail -1 measurements.txt  > last_measurement.txt

or more idiomatically just

sar -u 3 > measurements.txt 
tail -1 measurements.txt  > last_measurement.txt

or with tee to keep it all in one pipeline

sar -u 3 | tee measurements.txt | tail -n 1 >last_measurement.txt
tripleee
  • 175,061
  • 34
  • 275
  • 318
  • Unfortunately when I tried out both of these commands and they didn't work, nothing was being written to the last_measurements.txt file, just the measurements.txt file. – Mark O'Sullivan Jan 29 '15 at 15:24
  • 1
    Is there an empty line at the end of the `sar` output? Does `tail -n 1 measurements.txt` also output nothing? – tripleee Jan 29 '15 at 18:57
  • Making some progress here, I adjusted your last suggestion to ' sar -u 3 10 | tee measurement.txt; tail -n 1 measurement.txt > last_measurement.txt ' and this is adding the last line of the measurement.txt file which is the average of the last 30 seconds. – Mark O'Sullivan Jan 30 '15 at 10:41
  • The `tee` is superfluous then (unless you *want* the output to the screen as well). What you have is equivalent to the middle suggestion. – tripleee Jan 30 '15 at 10:48