2017-01-23 1 views
2

Mon programme peut suggérer à un utilisateur de fermer un processus spécifique s'il consomme trop de mémoire (ex: firefox ou chrome).Comment vérifier si un processus est un processus système sous Linux?

Cependant, sur mon système (Ubuntu 16.10 GNOME), certains processus spécifiques au système comme gnome-shell consomment trop de mémoire.

Mon client n'a aucune idée si un processus spécifique peut être fermé ou non.

Comment déterminer si un processus est un processus système (comme gnome-shell) et éviter de le fermer?

Voilà comment je suis le PID et obtiens nom du processus de ceux qui consomment de la mémoire max:

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

Il n'y a pas de distinction facile entre ce genre de « processus système » comme gnome-shell et tout autre processus utilisateur. Si Linux manque de mémoire, l'oom-killer essaiera de faire lui-même un choix qualifié et de terminer les processus jusqu'à la fin de la condition oom. Cela ne fonctionne pas toujours parfaitement, mais dans de nombreux cas, cela fait du bon travail! – Ctx

+0

Donc, fondamentalement, je devrais laisser le travail à l'OS lui-même? –

+0

Pour ce qui est de linux, je le suggérerais – Ctx

Répondre

1

IIRC, Ubuntu 16 est déjà basé systemd. Bien que cela pose quelques problèmes, au moins, il nettoyait beaucoup de cruft existant. En pratique, vos processus système sont gérés par le processus root systemd. Cela ne veut pas dire qu'ils sont tous des enfants du PID 1; systemd a un modèle un peu plus raffiné. En particulier, il comprend daemons bifurquer (dont le parent meurt),

Vous pouvez obtenir une liste arborescente des services systemd y compris de PID avec systemd-cgls (groupe de contrôle LiSt)