Inilah one-liner untuk menghitung total CPU untuk semua proses. Anda dapat menyesuaikannya dengan meneruskan filter kolom ke output teratas:
top -b -d 5 -n 2 | awk '$1 == "PID" {block_num++; next} block_num == 2 {sum += $9;} END {print sum}'
Anda dapat menemukan informasi ini di /proc/PID/stat
di mana PID adalah ID proses proses induk Anda. Dengan asumsi bahwa proses induk menunggu anaknya maka total penggunaan CPU dapat dihitung dari utime , waktu , lucu dan cstime :
utime %lu
Jumlah waktu proses ini telah dijadwalkan dalam mode pengguna, diukur dalam detak jam (dibagi dengan sysconf(_SC_CLK_TCK). Ini termasuk waktu tamu, waktu_tamu (waktu yang dihabiskan untuk menjalankan CPU virtual, lihat di bawah), sehingga aplikasi yang tidak mengetahui bidang waktu tamu tidak kehilangan waktu itu dari perhitungannya.
waktu %lu
Jumlah waktu proses ini telah dijadwalkan dalam mode kernel, diukur dalam detak jam (dibagi dengan sysconf(_SC_CLK_TCK).
lucu %ld
Jumlah waktu menunggu anak proses ini telah dijadwalkan dalam mode pengguna, diukur dalam detak jam (dibagi dengan sysconf(_SC_CLK_TCK). (Lihat juga waktu(2).) Ini termasuk waktu tamu, waktu_cguest (waktu yang dihabiskan untuk menjalankan CPU virtual, lihat di bawah).
waktu %ld
Jumlah waktu menunggu anak proses ini telah dijadwalkan dalam mode kernel, diukur dalam detak jam (dibagi dengan sysconf(_SC_CLK_TCK).
Lihat halaman manual proc(5) untuk detailnya.
Mungkin bukan perintah yang tepat. Tetapi Anda dapat melakukan sesuatu seperti di bawah ini untuk mendapatkan penggunaan cpu dari berbagai proses dan menambahkannya.
#ps -C sendmail,firefox -o pcpu= | awk '{s+=$1} END {print s}'
/proc/[pid]/stat Informasi status tentang proses. Ini digunakan oleh ps dan dibuat menjadi bentuk yang dapat dibaca manusia.
Cara lain adalah dengan menggunakan cgroups dan menggunakan cpuacct.
http://www.kernel.org/doc/Documentation/cgroups/cpuacct.txt
https://access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/sec-cpuacct.html
Dan tentu saja Anda dapat melakukannya dengan cara yang keras menggunakan C
lama yang bagusfind_cpu.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define MAX_CHILDREN 100
/**
* System command execution output
* @param <char> command - system command to execute
* @returb <char> execution output
*/
char *system_output (const char *command)
{
FILE *pipe;
static char out[1000];
pipe = popen (command, "r");
fgets (out, sizeof(out), pipe);
pclose (pipe);
return out;
}
/**
* Finding all process's children
* @param <Int> - process ID
* @param <Int> - array of childs
*/
void find_children (int pid, int children[])
{
char empty_command[] = "/bin/ps h -o pid --ppid ";
char pid_string[5];
snprintf(pid_string, 5, "%d", pid);
char *command = (char*) malloc(strlen(empty_command) + strlen(pid_string) + 1);
sprintf(command, "%s%s", empty_command, pid_string);
FILE *fp = popen(command, "r");
int child_pid, i = 1;
while (fscanf(fp, "%i", &child_pid) != EOF)
{
children[i] = child_pid;
i++;
}
}
/**
* Parsign `ps` command output
* @param <char> out - ps command output
* @return <int> cpu utilization
*/
float parse_cpu_utilization (const char *out)
{
float cpu;
sscanf (out, "%f", &cpu);
return cpu;
}
int main(void)
{
unsigned pid = 1;
// getting array with process children
int process_children[MAX_CHILDREN] = { 0 };
process_children[0] = pid; // parent PID as first element
find_children(pid, process_children);
// calculating summary processor utilization
unsigned i;
float common_cpu_usage = 0.0;
for (i = 0; i < sizeof(process_children)/sizeof(int); ++i)
{
if (process_children[i] > 0)
{
char *command = (char*)malloc(1000);
sprintf (command, "/bin/ps -p %i -o 'pcpu' --no-headers", process_children[i]);
common_cpu_usage += parse_cpu_utilization(system_output(command));
}
}
printf("%f\n", common_cpu_usage);
return 0;
}
Kompilasi:
gcc -Wall -pedantic --std=gnu99 find_cpu.c
Selamat menikmati!