0

私は Debian を使用しています。実行中のすべてのプロセスの良さを現在の良さに基づいて変更する方法はありますか? たとえば、niceness が -20 または -19 の現在実行中のすべてのプロセスを -10 に変更します。Renice は、プロセス、および特定のユーザーのプロセスを変更できます。しかし、私が知る限り、現在の素晴らしさに基づいてそれを行うことはできません.

-20 ナイスネスでプログラムを実行して、半定期的に発生するように見えるタイミング スパイクを回避しようとしています。これらは、同じ優先度を持つ特定のプロセスがリソースを占有していることが原因である可能性があります。私はこれをいくつかの良さをいじってチェックしたいと思っていました。

4

2 に答える 2

0

Cで始める何か:

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
#include <string.h>

static char *prstatname(char *buf, char **endptr)
{
    /* parse process name */
    char *ptr = buf;
    while (*ptr && *ptr != '(') ++ptr;
    ++ptr;
    if (!ptr) return 0;

    char *name = ptr;
    while (*ptr)
    {
        if (*ptr == ')' && *(ptr+1) && *(ptr+2) && *(ptr+3)
                && *(ptr+1) == ' ' && *(ptr+3) == ' ')
        {
            *ptr = 0;
            *endptr = ptr + 1;
            return name;
        }
        ++ptr;
    }
    return 0;
}

int main(void)
{
    DIR *proc = opendir("/proc");
    if (!proc) return 1;

    struct dirent *ent;

    while ((ent = readdir(proc)))
    {
        /* check whether filename is all numeric, then it's a process id */
        char *endptr;
        int pid = strtol(ent->d_name, &endptr, 10);
        if (*endptr) continue;

        /* combine to '/proc/{pid}/stat' to get information about process */
        char statname[64] = {0,};       
        strcat(statname, "/proc/");
        strncat(statname, ent->d_name, 52);
        strcat(statname, "/stat");

        FILE *pstat = fopen(statname, "r");
        if (!pstat) continue;

        /* try to read process info */
        char buf[1024];
        if (!fgets(buf, 1024, pstat))
        {
            fclose(pstat);
            continue;
        }
        fclose(pstat);

        char *name = prstatname(buf, &endptr);
        if (!name) continue;

        /* nice value is in the 17th field after process name */
        int i;
        char *tok = strtok(endptr, " ");
        for (i = 0; tok && i < 16; ++i) tok = strtok(0, " ");
        if (!tok || i < 16) continue;

        int nice = strtol(tok, &endptr, 10);
        if (*endptr) continue;

        printf("[%d] %s -- nice: %d\n", pid, name, nice);
    }
}

このプログラムを理解していれば、やりたいことができるように簡単に変更できます。

于 2015-09-22T20:23:37.377 に答える