2017-01-23 9 views
2

Моя программа может предложить пользователю закрыть конкретный процесс, если он потребляет слишком много памяти (например, firefox или chrome).Как проверить, является ли процесс системным процессом в Linux?

Однако в моей системе (Ubuntu 16.10 GNOME) некоторые системные процессы, такие как gnome-shell, потребляют слишком много памяти.

Мой клиент не имеет понятия, может ли какой-либо конкретный процесс быть закрыт или нет.

Как определить, является ли процесс системным процессом (например, gnome-shell) и не закрывать его?

Это, как я получить PID и имя процесса тех, которые потребляют максимальную память:

FILE * pipe = popen("ps aux --sort=-%mem | awk 'NR<=2{print $2}'", "r"); 

if(pipe) 
{ 
    char line[line_buf]; 
    while(fgets(line, sizeof line, pipe) != NULL) 
    { 
     if(sscanf(line, "%d", &_pid) == 1) 
     { 
      _mem->pid = _pid; 
     } 
    } 
} 

pclose(pipe); 

if(_mem->pid != 0) { 
    char command[128], pidname[40]; 
    snprintf(command, sizeof command, "cat /proc/%d%s", _pid, "/comm"); 

    FILE * _pipe = popen(command, "r"); 
    if(pipe) 
    { 
     char line[line_buf]; 
     fgets(line, sizeof line, _pipe); 
     sscanf(line, "%s\n", pidname); 
    } 

    pclose(_pipe); 
    strcpy(_mem->pname, pidname); 
} 
+4

Там нет простого различия между таким родом «системными процессами» как gnome-shell и любой другой пользовательский процесс. Если в Linux не хватает памяти, oom-killer попытается сделать сам квалифицированный выбор и прекратит процесс до тех пор, пока не закончится условие oom. Это не всегда работает отлично, но во многих случаях это делает хорошую работу! – Ctx

+0

Так что в принципе я должен оставить работу самой ОС? –

+0

Что касается linux, я бы предложил так – Ctx

ответ

1

IIRC, Ubuntu 16 уже Systemd основе. Хотя у этого есть некоторые проблемы, по крайней мере, он очистил много существующего крутого. Практически говоря, ваши системные процессы управляются процессом root systemd. Это не значит, что все дети ПИД-1; systemd имеет немного более совершенную модель. В частности, он понимает разветвление демонов (чей родитель умирает),

Вы можете получить TreeList из Systemd услуг, включая PID с systemd-cgls (контрольной группой перечислите)

 Смежные вопросы

  • Нет связанных вопросов^_^